[英]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放弃等待并独自将“存储”发送到数据包中。
在服务器中,您必须
recv()
检索多个“商店”, recv()
调用。 usleep
是一种hack,可能并不总是有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.