Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同步读取多个TCP响应_C++_Sockets_Tcp_Network Programming_Boost Asio - Fatal编程技术网

C++ 同步读取多个TCP响应

C++ 同步读取多个TCP响应,c++,sockets,tcp,network-programming,boost-asio,C++,Sockets,Tcp,Network Programming,Boost Asio,我正在编写一个简单的POP3客户端。例如,当我向POP3服务器发出LIST请求时,它会用可用消息的索引和大小(字节)进行响应。看起来是这样的: +OK 3 messages\r\n 1 103\r\n 2 140\r\n 3 184\r\n 我使用boost::asio::read_until和\r\n作为分隔符,但这样我无法保持同步,因为有时只读取第一部分,例如+OK 3消息\r\n1 103\r\n,这是乐观的情况。我希望我的程序等待消息的最后一部分。我提出的唯一解决方案是在发出请求之后和

我正在编写一个简单的POP3客户端。例如,当我向POP3服务器发出
LIST
请求时,它会用可用消息的索引和大小(字节)进行响应。看起来是这样的:

+OK 3 messages\r\n
1 103\r\n
2 140\r\n
3 184\r\n
我使用
boost::asio::read_until
\r\n
作为分隔符,但这样我无法保持同步,因为有时只读取第一部分,例如
+OK 3消息\r\n1 103\r\n
,这是乐观的情况。我希望我的程序等待消息的最后一部分。我提出的唯一解决方案是在发出请求之后和阅读请求之前放置
sleep()
,但这似乎不是一个可靠且方便的解决方案。 有什么更好的方法来处理这个问题呢?

根据秘密是等待一个合适的分隔符,即
\r\n


credits:@RemyLebeau

如果你想进行同步读取,那么首先为什么要使用库来异步处理数据?您的代码是否应该基于事件。@SteffenUllrich这是一个好问题,但我的工作太多,时间太短。以异步方式处理此问题的正确方法是简单地收集和组合多个读取事件的响应部分,并在收到完整响应后进行处理。错误的方法是以某种方式等待繁忙的循环或睡眠,因为在这种情况下,您的程序无法处理其他事件。@user207421谢谢,很抱歉问了一个愚蠢的问题,这是我第一次与网络联系programming@user207421很明显你还没有读过,因为这不是
列表
响应的实际工作方式,甚至不是关闭。
+OK
后面的文本是任意的,不应被解析或依赖于处理。在列出最后一条消息后,响应实际上由
\r\n
行终止。这是您需要等待的分隔符。在这两种情况下,终止符都是同一行:
\r\n
。再次仔细阅读说明书,尤其是其中描述了所有多行响应的格式。@RemyLebeau Ohh,你说得对。似乎,
\r\n.\r\n
的工作出于某种巧合。