Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите разобраться с сокетами.
Форумы портала PHP.SU » » Работа с сетью » Помогите разобраться с сокетами.

Страниц (1): [1]
 

1. jaxmackey - 02 Февраля, 2016 - 18:15:42 - перейти к сообщению
Здраствуйте. Хочу запустить сокет сервер на vps так, чтобы он был доступен из интернета.
Вот код сервера:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.   header('Content-Type: text/plain;'); //Мы будем выводить простой текст
  3.   set_time_limit(0); //Скрипт должен работать постоянно
  4.   ob_implicit_flush(); //Все echo должны сразу же отправляться клиенту
  5.   $address = '92.102.92.81';
  6.   $port = 1225; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
  7.   if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
  8.     //AF_INET - семейство протоколов
  9.     //SOCK_STREAM - тип сокета
  10.     //SOL_TCP - протокол
  11.     echo "Ошибка создания сокета";
  12.   }
  13.   else {
  14.     echo "Сокет создан\n";
  15.   }
  16.   //Связываем дескриптор сокета с указанным адресом и портом
  17.   if (($ret = socket_bind($sock, $address, $port)) < 0) {
  18.     echo "Ошибка связи сокета с адресом и портом";
  19.   }
  20.   else {
  21.     echo "Сокет успешно связан с адресом и портом\n";
  22.   }
  23.   //Начинаем прослушивание сокета (максимум 5 одновременных соединений)
  24.   if (($ret = socket_listen($sock, 5)) < 0) {
  25.     echo "Ошибка при попытке прослушивания сокета";
  26.   }
  27.   else {
  28.     echo "Ждём подключение клиента\n";
  29.   }
  30.   do {
  31.     //Принимаем соединение с сокетом
  32.     if (($msgsock = socket_accept($sock)) < 0) {
  33.       echo "Ошибка при старте соединений с сокетом";
  34.     } else {
  35.       echo "Сокет готов к приёму сообщений\n";
  36.     }
  37.     $msg = "Hello!"; //Сообщение клиенту
  38.     echo "Сообщение от сервера: $msg";
  39.     socket_write($msgsock, $msg, strlen($msg)); //Запись в сокет
  40.     //Бесконечный цикл ожидания клиентов
  41.     do {
  42.       echo 'Сообщение от клиента: ';
  43.       if (false === ($buf = socket_read($msgsock, 1024))) {
  44.         echo "Ошибка при чтении сообщения от клиента";       }
  45.       else {
  46.         echo $buf."\n"; //Сообщение от клиента
  47.       }
  48.       //Если клиент передал exit, то отключаем соединение
  49.       if ($buf == 'exit') {
  50.         socket_close($msgsock);
  51.         break 2;
  52.       }
  53.       if (!is_numeric($buf)) echo "Сообщение от сервера: передано НЕ число\n";
  54.       else {
  55.         $buf = $buf * $buf;
  56.         echo "Сообщение от сервера: ($buf)\n";
  57.       }
  58.       socket_write($msgsock, $buf, strlen($buf));
  59.     } while (true);
  60.   } while (true);
  61.   //Останавливаем работу с сокетом
  62.   if (isset($sock)) {
  63.     socket_close($sock);
  64.     echo "Сокет успешно закрыт";
  65.   }
  66. ?>


Вот код клиента:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.   header('Content-Type: text/plain;'); //Мы будем выводить простой текст
  3.   set_time_limit(0); //Скрипт должен работать постоянно
  4.   ob_implicit_flush(); //Все echo должны сразу же выводиться
  5.   $address = "92.102.92.81";
  6.   $port = "1225"; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
  7.   if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
  8.     //AF_INET - семейство протоколов
  9.     //SOCK_STREAM - тип сокета
  10.     //SOL_TCP - протокол
  11.     echo "error create soket";
  12.   }
  13.   else {
  14.     echo "create soket\n";
  15.   }
  16.   $result = socket_connect($socket, $address, $port);
  17.   if ($result === false) {
  18.     echo "error conect soket";
  19.   } else {
  20.     echo "connect done\n";
  21.   }
  22.   $out = socket_read($socket, 1024); //Читаем сообщение от сервера
  23.   echo "msg at server: $out.\n";
  24.   $msg = "15";
  25.   echo "msg for server: $msg\n";
  26.   socket_write($socket, $msg, strlen($msg)); //Отправляем серверу сообщение
  27.   $out = socket_read($socket, 1024); //Читаем сообщение от сервера
  28.   echo "msg at server: $out.\n"; //Выводим сообщение от сервера
  29.   $msg = 'exit'; //Команда отключения
  30.   echo "msg for server: $msg\n";
  31.   socket_write($socket, $msg, strlen($msg));
  32.   echo "connect abort\n";
  33.   //Останавливаем работу с сокетом
  34.   if (isset($socket)) {
  35.     socket_close($socket);
  36.     echo "soket close";
  37.   }
  38. ?>


Подскажите какие адреса мне указывать? адрес моего сервера внешний 92.102.92.81(пример) добавлял порты разные клиент выдавал ощибки постоянно не подключался.. подскажите по поводу адресов.. я думаю в них проблема. только не понимаю или не знаю где что менять.
2. armancho7777777 - 02 Февраля, 2016 - 18:23:23 - перейти к сообщению
Попробуйте указать локальный (127.0.0.1), а стучаться через внешний.
Ну и про порт не забудьте.
3. jaxmackey - 02 Февраля, 2016 - 18:55:00 - перейти к сообщению
armancho7777777 пишет:
Попробуйте указать локальный (127.0.0.1), а стучаться через внешний.
Ну и про порт не забудьте.


Порты указаны что там что там одинаковые только ip изменил как вы сказали.
Выдает туже ощибку что и тогда..
Warning: socket_connect(): unable to connect [10060]

На vps все Ip, порты, TCP добавил в брандмауэр
4. armancho7777777 - 02 Февраля, 2016 - 19:36:10 - перейти к сообщению
Сам сокет сервер-то запустили ?
5. jaxmackey - 02 Февраля, 2016 - 19:44:39 - перейти к сообщению
armancho7777777 пишет:
Сам сокет сервер-то запустили ?


Конечно запустил. Через cmd на сервере смотрю. запускается и происходит эффект зависания но сервер вроде как работает. может как то можно проверить работает ли этот сервер?
6. armancho7777777 - 02 Февраля, 2016 - 19:56:33 - перейти к сообщению
Откройте второй терминал, выполните (значения свои подставьте):
telnet {ip} {port}
(Добавление)
Например:
telnet 127.0.0.1 1000
7. jaxmackey - 03 Февраля, 2016 - 19:20:52 - перейти к сообщению
armancho7777777 пишет:
Откройте второй терминал, выполните (значения свои подставьте):
telnet {ip} {port}
(Добавление)
Например:
telnet 127.0.0.1 1000


Да сервер работает. Telnet соеденяется. как теперь соеденится с другого компьютера на этот же сервер. так как по внешнему адресу сервер этот не доступен.
8. armancho7777777 - 04 Февраля, 2016 - 16:28:41 - перейти к сообщению
Машина, случаем, не у Вас дома стоит ?
Если да, то сеть напрямую или через роутер ?
Если второе, то проброска портов вылечит.
В настройках роутера.
9. Viper - 04 Февраля, 2016 - 16:39:13 - перейти к сообщению
armancho7777777
jaxmackey пишет:
сокет сервер на vps
намекает Улыбка
10. armancho7777777 - 04 Февраля, 2016 - 20:05:08 - перейти к сообщению
Читал, видимо, между строк.
Хрен его знает тогда, разбираться надо.
Телепатия бессильна.

 

Powered by ExBB FM 1.0 RC1