Я создал сервер сокетов PHP. Я подключился к нему с помощью telnet или putty, и все работает хорошо, пока я не попытался подключиться к приложению .Net, каждый раз, когда я запускаю приложение, оно закрывает сервер, вот мой код C #, только две строки:
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 # не будет закрыто, а затем закроется с тем же сообщением об ошибке выше.
Так в чем же причина проблемы? Клиент не должен закрывать сокет таким образом.
Спасибо
Глядя на код на 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 do socket_create()
снова.
Других решений пока нет …