PHP套接字被客户端强行关闭

时间:2015-04-23 10:40:32

标签: c# php sockets php-socket

我创建了一个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#应用程序关闭,然后它将以上面相同的错误消息关闭。

那么是什么导致了这个问题?客户端不能以这种方式关闭套接字。

谢谢

1 个答案:

答案 0 :(得分:3)

查看http://php.net/manual/en/sockets.examples.php处的代码,我发现它没有任何问题。当socket关闭时,此代码存在脚本:

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()循环中,这样每次套接字读取失败时,再次执行socket_create()