我必须创建一个函数,在其中我将数据包发送到服务器然后读取数据。过了一段时间,我有时需要使用相同的套接字再次向服务器发送数据(需要我使用相同的套接字)。
由于某种原因,第二次发送,即读取后不发送数据(它返回正确的数字(不是假),但服务器不接收数据包)。如果我创建新套接字并发送数据 - 它可以工作。
以下是一个例子:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '192.168.1.179', 1455);
socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
$this->socket_functions->send_message($socket,$sendMsg,$funcName);
$tmp = trim($this->socket_functions->read_packet($socket));
for($i =0; $i<10; $i++)
{
$tmp = trim($this->socket_functions->read_packet($socket));
$this->socket_functions->send_message($socket, 'AAAA', $funcName); //doesn't work
/*
///works
$socket2 = $this->socket_functions->create_socket();
$this->socket_functions->send_message($socket2, 'AAAA', $funcName);
$this->socket_functions->disconnect($socket2);
*/
}
函数create_socket与前3行相同,因此连接数据相同。我把它拿出来让你能看到我的配置。
对于读写,我使用函数socket_send()和socket_write()。
读取数据包功能:
$resultMsg = "";
while(strlen($currentData = socket_read($socket,256))==256)
{
$resultMsg .=$currentData;
}
$resultMsg.=$currentData;
if(strlen($resultMsg)>1 && strpos($resultMsg,'<')>0)
{
$resultMsg = substr($resultMsg,strpos($resultMsg,'<'));
}
return $resultMsg;
发送信息包:
function create_packet($msg, $type)
{
$msg = $type.$this->convert_data->IntToAsciiChars(strlen($msg)).$msg;
$msg = chr(0).$this->convert_data->IntToAsciiChars(strlen($msg)).$msg;
return $msg;
}
function send_message($socket,$msg,$type)
{
$packet = $this->create_packet($msg,$type);
$res = socket_send($socket,$packet,strlen($packet),0);
if($res === false) return false;
return true;
}
修改
我做了更多测试并发现,只有当我连接的服务器不断发送数据时,才会发生这种情况。在 - 服务器发送多个数据包。如果我尝试在服务器发送所有数据包之前发送数据包,则不会收到数据包。有谁知道为什么会这样?我有桌面应用程序,它做同样的事情(在服务器发送数据时使用相同的套接字发送数据),但它在那里工作。有具体的东西吗?
答案 0 :(得分:1)
我终于设法解决了这个问题。经过测试后我发现,如果我使用发送 n + 1 次来发送消息,其中 n 是读取的次数被称为,然后我能够发送消息。
我真的不知道为什么会这样 - 也许这里有人知道?