我正在使用read
和write
函数在客户端和服务器之间进行通信。
如果服务器使用两次write
,在 Wireshark 中我可以看到发送了两个数据包,但我的read
函数在一个缓冲区中连接了两个数据包
问题:
我的read
函数可以一次只读取一个有效负载吗?
我不想减少缓冲区
实施例 现在的情况:
发送(8字节)发送(8字节)
读取,读取16个字节
我想要
发送(8字节)发送(8Bytes)
读取,读取8个字节(第一个数据包)
读取,读取8个字节(第二个数据包)
答案 0 :(得分:3)
TCP / IP为您提供有序的字节流。正如您所见,不保证读取和写入具有相同的边界。
要查看消息的开始和结束位置,您需要在协议中添加额外信息以提供此信息。一种可行的简单方法是在每条消息的开头有一个字节数。读取字节数,然后您知道要读取多少字节以获取完整的消息,而不知道下一条消息。
答案 1 :(得分:0)
如果要同步服务器和客户端使用信号量之类的东西,或者您可以发送读/写字节,这样可以避免在客户端读取之前发送信息。或者,如果您确切知道消息的长度,则可以分隔已重新生成的字节。如果你使用缓冲区确切的消息长度,那么字节将会丢失,所以当读者读取上一条消息或扩展缓冲区并分离多条消息时,让服务器发送信息。