PHP套接字连接:循环读取和发送数据

时间:2014-09-11 12:54:59

标签: php sockets loops

我必须创建一个函数,在其中我将数据包发送到服务器然后读取数据。过了一段时间,我有时需要使用相同的套接字再次向服务器发送数据(需要我使用相同的套接字)。

由于某种原因,第二次发送,即读取后不发送数据(它返回正确的数字(不是假),但服务器不接收数据包)。如果我创建新套接字并发送数据 - 它可以工作。

以下是一个例子:

$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;
}

修改

我做了更多测试并发现,只有当我连接的服务器不断发送数据时,才会发生这种情况。在 - 服务器发送多个数据包。如果我尝试在服务器发送所有数据包之前发送数据包,则不会收到数据包。有谁知道为什么会这样?我有桌面应用程序,它做同样的事情(在服务器发送数据时使用相同的套接字发送数据),但它在那里工作。有具体的东西吗?

1 个答案:

答案 0 :(得分:1)

我终于设法解决了这个问题。经过测试后我发现,如果我使用发送 n + 1 次来发送消息,其中 n 是读取的次数被称为,然后我能够发送消息。

我真的不知道为什么会这样 - 也许这里有人知道?