我有这段代码:
$requestCount = 0;
$maxRequestCount = 10;
$ip = "192.168.0.100";
$port = 10000;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connect = socket_connect($socket, $ip, $port);
while(true){
if($requestCount == $maxRequestCount){break;}
$write = socket_write($socket, $getHTTP, strlen($getHTTP));
echo "Sending TCP message... OK (lenght = $write).<br>";
$out = '';
while($out = socket_read($socket, 65536)){echo "Reading response... OK (lenght = ". strlen($out).")<br>";}
echo "<br>";
usleep(100);
$requestCount++;
}
socket_close($socket);
当发出第一个请求时,连接已经关闭(FYN,ACK)。 如何发送10个数据包,然后关闭连接?
答案 0 :(得分:1)
你不能。就像现实世界的对话一样,没有办法强迫那些不感兴趣的人继续听。以同样的方式,您无法停止套接字另一端的计算机关闭它。
从代码中的变量名称判断,看起来您正在发送HTTP请求(仅在不同的端口上)。 HTTP服务器可以选择在响应连接中的第一个请求后关闭连接。这似乎是在这里发生的事情。您必须创建一个新套接字并重新连接以发送每个请求。
另一个注意事项:TCP没有&#34;数据包&#34;。它是一个面向流的连接。我知道这听起来像是一个迂腐的差异,但是问你如何在不关闭连接的情况下发送多个数据包是没有意义的,因为你无法控制TCP的方式发送你的消息。
答案 1 :(得分:1)
从数据包捕获中可以看出,您向对等体发送342个字节(第4行),然后对等体以1446字节(第6行)响应,然后关闭连接(第7行中的FIN)。从那时起,服务器将无法接受来自客户端的更多数据,因此任何发送更多数据的尝试都将被RST拒绝。
我不知道你想要实现什么,但由于服务器在客户端完成发送数据之前关闭了连接,因此可能存在一些错误。您可能从服务器响应中获取更多详细信息,或者它可能只是协议验证,即客户端不以与服务器相同的协议或不以正确的方式说话。例如,如果您尝试使用您的代码与HTTP服务器通话,那将是完全错误的,因为您不关心保持活动,体长等。
答案 2 :(得分:0)
远程端可能关闭了连接。
可能是因为你必须控制socket_write返回的内容。您无法保证socket_write会立即写入您的整个缓冲区。如果socket_write返回8142(例如),则必须剪切缓冲区$getHTTP = substr($getHTTP, 8142);
并再次尝试socket_write
。如果socket_write(...)=== false,则出现错误并且连接已关闭,您也必须对其进行测试。