2015-04-23 2 views
1

Я создал сервер сокетов PHP. Я подключился к нему с помощью telnet или putty, и все работает хорошо, пока я не попытался подключиться в приложении .Net, каждый раз, когда я запускаю приложение, он закрывает сервер, вот мой код C#, только две строки:Закрытие PHP-сокета принудительно клиентом

System.Net.Sockets.TcpClient cli = new System.Net.Sockets.TcpClient("192.168.0.200", 10000); 
cli.Close(); 

Когда я запустить приложение на сервере PHP сокет закрыт с этой ошибкой:

Warning: socket_read(): unable to read from socket [0]: An existing connection was forcibly closed by the remote host 

Я попытался закомментировав Cli.close() линии, и конечно же сокет остался открытым до тех пор, C# приложение не будет закрыто, то его будет закрываться с тем же сообщением об ошибке выше.

Так что же вызывает проблему ?, клиент не должен закрывать сокет таким образом.

Спасибо

+0

Можете ли вы дать код php, ответственный за чтение сокетов? – Stepashka

+0

Это точно так же, как в примере руководства http://php.net/manual/en/sockets.examples.php –

+0

В чем проблема? Если клиент закрывает соединение, что вы ожидаете? Если вы подключаетесь к telnet/putty, и вы удаляете соединение, закрывая telnet/putty с помощью taskmanager (поэтому без ввода 'quit' или' shutdown' в telnet/putty) вы получаете другое поведение? –

ответ

2

Глядя на код в http://php.net/manual/en/sockets.examples.php я не вижу никаких проблем с ним. Этот код существует сценарий, когда сокет закрыт:

if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { 
     echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; 
     break 2; 
    } 

Что я могу предложить, чтобы изменить код следующим образом:

if (false === ($buf = @socket_read($msgsock, 2048, PHP_NORMAL_READ))) { 
     echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; 
     break; 
    } 

Добавление «@» будет предотвратить предупреждение появляться. Изменение break 2; на break; сделает сервер не для выхода, а для продолжения следующего соединения.

Если это не сработает, вы можете обернуть весь скрипт в другой цикл do { } while(), чтобы каждый раз, когда сокет читал сбой php, снова выполните socket_create().

+0

Это решение работает, но я чувствую, что это не способ сделать это, я все еще получаю сообщение об ошибке (если я не подавляю его с @), который я верьте, не должно быть, но я могу отправить бросить, когда приложение закрыто в приложении .Net, чтобы решить эту проблему, спасибо –

+0

Предупреждение - это нормальное поведение для 'socket_read', хотя и не самое лучшее. На производстве вы можете отключить предупреждения, сделав что-то вроде этого http://stackoverflow.com/questions/332178/best-way-to-suppress-php-errors-on-production-servers. Удачи. – Stepashka

 Смежные вопросы

  • Нет связанных вопросов^_^