我正在尝试通过 PHP 套接字发送数据,客户端是 Arduino 设备,当我多次发送时它接收数据正常,但是如果我重置客户端(Arduino 设备),它会在几秒钟内重新启动,它说连接到 PHP 套接字,然后当我想再次发送数据时,它会socket_send()默默地失败,PHP在第一个实际错误时不会返回错误,只有在我第二次尝试(并失败)时,才会返回错误(“零”socket_send()发送的字节数”)。收到此错误时,我创建另一个错误socket_accept()并成功发送消息。
什么可能导致这种情况?我希望它能够正确检测丢失的连接,以便我可以在需要时重新发送数据。
感觉就像它向旧连接发送数据,并且只有在第二次尝试时才意识到,这可能吗?
这可以通过 解决吗socket_select()?我很难理解它的作用。
澄清:如果客户端重新启动并再次连接,则向其发送数据将返回int,然后返回false, false, false(除非我取消设置$accept并再次执行 a socket_accept())。如果客户端保持离线状态,则发送始终返回int, int, int。 int是发送的字符串的大小。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
// reuse any existing open port to avoid error
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
$result = socket_listen($socket) or die("Could not set up socket listener\n");
do{
if(!isset($accept)){
echo "\nwaiting for clients";
$accept = @socket_accept($socket) or die("Could not accept incoming connection");
echo "\nclient connected";
}
// memcached will return a message here like: "my message\r\n"
$message_to_send = $memcached->get('my_socket_message');
if($message_to_send!=''){
echo "\nsending: ".$message_to_send;
$total_data_sent = @socket_send($accept, $message_to_send, strlen($message_to_send), MSG_EOR);
// if data was not send (sent to an old connection ?!)...
// then clear $accept, so a new connection is accepted
// and keep the my_socket_message variable, so message is sent again
if($total_data_sent === false){
echo "\nSEND FAILED, will retry message: ".$message_to_send;
unset($accept);
} else {
$memcached->delete('my_socket_message');
}
}
} while (true);
鸿蒙传说
湖上湖