同步读写

时间:2018-06-01 15:42:33

标签: c sockets

我正在使用readwrite函数在客户端和服务器之间进行通信。

如果服务器使用两次write,在 Wireshark 中我可以看到发送了两个数据包,但我的read函数在一个缓冲区中连接了两个数据包

问题: 我的read函数可以一次只读取一个有效负载吗? 我不想减少缓冲区

实施例 现在的情况:

  

发送(8字节)发送(8字节)

     

读取,读取16个字节

我想要

  

发送(8字节)发送(8Bytes)

     

读取,读取8个字节(第一个数据包)

     

读取,读取8个字节(第二个数据包)

2 个答案:

答案 0 :(得分:3)

TCP / IP为您提供有序的字节流。正如您所见,不保证读取和写入具有相同的边界。

要查看消息的开始和结束位置,您需要在协议中添加额外信息以提供此信息。一种可行的简单方法是在每条消息的开头有一个字节数。读取字节数,然后您知道要读取多少字节以获取完整的消息,而不知道下一条消息。

答案 1 :(得分:0)

如果要同步服务器和客户端使用信号量之类的东西,或者您可以发送读/写字节,这样可以避免在客户端读取之前发送信息。或者,如果您确切知道消息的长度,则可以分隔已重新生成的字节。如果你使用缓冲区确切的消息长度,那么字节将会丢失,所以当读者读取上一条消息或扩展缓冲区并分离多条消息时,让服务器发送信息。