C# 客户端强制关闭PHP套接字

C# 客户端强制关闭PHP套接字,c#,php,sockets,php-socket,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

我创建了一个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#app关闭,然后它将关闭,并显示上面相同的错误消息

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

谢谢

查看位于的代码,我看不出有任何问题。当套接字关闭时,脚本中存在以下代码:

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到<代码>中断将使服务器不退出,而是继续等待下一个连接


如果这不起作用,您可以将整个脚本包装到另一个
do{}while()
循环中,这样每次套接字读取失败时,php都会再次执行
socket\u create()

您能给出一个负责套接字读取的php代码吗?它与手册示例中的完全相同您的问题是什么?如果客户端关闭了连接,您希望得到什么?如果您使用telnet/putty进行连接,并通过taskmanager关闭telnet/putty来终止连接(因此,在telnet/putty中没有键入
quit
shutdown
),您会得到不同的行为吗?@nl-x在.Net应用程序中,当客户端关闭连接时,它不仅会断开客户端的连接,它也会关闭连接服务器,而当使用putty或Microsoft的telnet时,退出或甚至强制关闭客户端应用程序都不起作用,套接字会保持打开状态,等待将来的客户端。此解决方案可以工作,但我觉得这不是解决方法,我仍然会收到错误消息(如果我不使用@抑制它)我认为不应该是这种情况,但我可以在.Net应用程序中关闭应用程序时发送quit来解决此问题,谢谢警告是
socket\u read
的正常行为,而不是最佳行为。在生产环境中,您可以通过如下操作禁用警告。祝你好运,关键是突破2,突破2适用于突破。这将关闭if和do while