Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP套接字模块检测对等断开连接(EOF)_Php_Sockets_Eof - Fatal编程技术网

使用PHP套接字模块检测对等断开连接(EOF)

使用PHP套接字模块检测对等断开连接(EOF),php,sockets,eof,Php,Sockets,Eof,我对PHP的套接字库有一个奇怪的问题:我似乎无法检测/区分服务器EOF,因此我的代码无助地进入无限循环 进一步解释如下;首先,一些背景(这里没有什么特别有趣的事情): 好吧,我想我还是把上面的评论变成一个答案吧。瑞安·文森特帮我的厚脑袋解决了这个问题,这一切都归功于他:) socket\u recv将返回0,特别是当对等方已断开连接时,或者如果发生任何其他网络错误,则返回FALSE。 作为参考,在C语言中,recv()的返回值是您刚收到的新数据的长度(可以是0),或-1以指示错误条件(其值可以在

我对PHP的套接字库有一个奇怪的问题:我似乎无法检测/区分服务器EOF,因此我的代码无助地进入无限循环

进一步解释如下;首先,一些背景(这里没有什么特别有趣的事情):


好吧,我想我还是把上面的评论变成一个答案吧。瑞安·文森特帮我的厚脑袋解决了这个问题,这一切都归功于他:)

socket\u recv
将返回
0
,特别是当对等方已断开连接时,或者如果发生任何其他网络错误,则返回
FALSE
。 作为参考,在C语言中,
recv()
的返回值是您刚收到的新数据的长度(可以是
0
),或
-1
以指示错误条件(其值可以在
errno
中找到)

使用
0
来指示错误条件(以及仅一种任意类型的错误条件)不是PHP的标准和唯一错误方法。其他网络库不是这样工作的

你需要像这样处理它

$r=socket\u recv($socket,$buf,$len);
如果($r==FALSE){
//了解刚刚发生的套接字\u last\u错误()
//(在下面的评论中有一个错误代码列表
// http://php.net/socket_last_error -考虑/研究
//(推荐每种情况的后果)
}elseif($r==0){
//对等方已关闭连接。您需要处理此问题
//条件和清洁。
}否则{
//此时您确实有数据。
//虽然不太可能,但远程对等机也有可能
//已向您发送长度为0的数据;请记住使用strlen($buf)。
}

TCP/IP套接字不是这样工作的。没有“自然”的方法来检测链接的另一端是否“消失”。这些不是文件读取/写入。这是通过“希望它到达那里”或“希望得到一些东西回来”传递的消息:)记住,有一些常见的技术可以检测到“客户离开了”。最简单的方法是在协议中设计一些东西,用于与客户端“交换数据”。我使用“ping请求”。短时间内没有回复-它已经过去了。一些方法。。。也许有趣?这些也适用于PHP。还有,PHP:我明白你的意思了,谢谢你的大量参考资料。请注意,当我的代码失败并落入无限循环时,无限循环包含读取操作,并且在读取操作之后,套接字函数报告“成功”(并永远继续循环)。出于这个原因,我怀疑我看到的是PHP.Oh中可能存在的错误行为。所以在正常情况下我永远不会得到0字节的数据?这就是它的工作原理吗?好的,
socket\u select
很聪明,它会检查客户端是否还在。它将等待,直到它有有用的信息返回。1) 您必须检查
socket\u select
语句是否返回错误。目前,您正在处理一个文件读取的文件。请不要。2) 如果没有错误,则始终检查返回的数据长度-零表示客户端已“离开”。通过这样做,您应该可以从代码中获得更多有用的结果。我倾向于使用大约60秒的长超时。