繁体   English   中英

使用php作为C ++服务器的套接字客户端

[英]Using php as a socket client for a C++ server

我面临一个奇怪的问题。

我用C ++编写了一个小型服务器,该服务器将对象以二进制格式存储在文件中。

我用telnet成功测试了它。

telnet 127.0.0.1 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
store 1 1 5 1
store 1 1 5 2

服务器上的输出现在是

Command : store 1 1 5 1
Command : store 1 1 5 2

由于我们将使用php来存储这些信息,因此我编写了一个小的php脚本,该脚本将向我们的服务器发送10条命令。

<?php

    $socket = socket_create(AF_INET,SOCK_STREAM,0);
    socket_connect($socket,"127.0.0.1",1234);

    for($i = 0;$i < 10;$i++){

        $command = "store 1 $i 5 1\r\n";

        echo $command;

        socket_write($socket,$command,strlen($command));

    }

    socket_close($socket);

?>

问题是服务器的输出现在是:

Command : store 1 0 5 1store 1 1 5 1store 1 2 5 1store 1 3 5 1store 1 4 5 1store 1 5 5 1store 1 6 5 1store 1 7 5 1store 1 8 5 1store 1 9 5 1

\\ r \\ n无法识别。 搜索后,我发现通过在socket_write函数之后添加usleep(10000)可以实际工作。

我试图避免使用此替代方法,因此我不得不提出以下问题:

为什么usleep可以解决此问题? 我怎么能不睡着呢?

谢谢阅读!

我们必须确定要查看您的C ++服务器,但我怀疑您在此处错误地解析了数据。

TCP是一种流协议,在该协议中,数据包中的数据没有边界。 因此,当您发送多个“存储”命令时,它们可能都出现在同一TCP数据包中。 然后,当您调用recv()您可能会获得多个“存储”。 但是,由于时间安排以及telnet可能正在发送其自己的数据包中的每一行这一事实,对recv()每次调用都可能会检索到一个“ store”命令。

当您进入休眠状态时,实际上是在延迟更多数据的排队,TCP放弃等待并独自将“存储”发送到数据包中。

在服务器中,您必须

  1. 期望从recv()检索多个“商店”,
  2. 期望将单个“存储”拆分为多个recv()调用。

usleep是一种hack,可能并不总是有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM