C 发送/接收是否以相同的数据块传输数据?

C 发送/接收是否以相同的数据块传输数据?,c,winsock,send,data-transfer,recv,C,Winsock,Send,Data Transfer,Recv,我的客户: send(socket, "this is a buffer", ...); send(socket, "second buffer", ...); 从我的服务器上看,recv是否保证用中的r结束一个块,并用中的s开始另一个块“第二个缓冲区”?不,一点也不。由于网络的所有处理,您无法控制接收数据时发生的情况。您不能对任何recv调用中您将获得多少进行任何假设(除非是否,Windows套接字(与其他基于TCP的抽象)正在流式传输。您正在寻找一种打包方式来使用Windows套接字 试试

我的客户:

send(socket, "this is a buffer", ...);
send(socket, "second buffer", ...);

从我的服务器上看,
recv
是否保证用
中的
r
结束一个块,并用
中的
s
开始另一个块“第二个缓冲区”

不,一点也不。由于网络的所有处理,您无法控制接收数据时发生的情况。您不能对任何recv调用中您将获得多少进行任何假设(除非是否,Windows套接字(与其他基于TCP的抽象)正在流式传输。您正在寻找一种打包方式来使用Windows套接字

试试这个:

我不相信这一点。在阅读时,你可能会一次获得所有数据。中间有很多事情——数据包重新排序、网络延迟等,这些都会影响数据包实际到达另一端的时间,可能是第二个缓冲区比第一个缓冲区更快地找到路径并等待(如果您正在使用TCP,如果不使用,则不使用)。第一个到达的数据将被提供给您。您应该在接收方解析数据,而不依赖数据的发送方式(TCP为您提供某些订单保证,UDP也不这样做).

如果希望recv在收到指定的字节数之前一直阻塞,可以使用标志MSG_WAITALL


对于UDP和其他数据报协议,数据包边界将按您的意愿保留。对于TCP和其他流协议,没有这种运气。

我的意思是,在我的示例中,我是否会收到(例如)
“缓冲\0秒bu”
?如果答案是肯定的,我如何区分一个“数据包”和另一个?我应该使用某种终止顺序吗?是的,你也可以接收。你需要在数据中有一些东西来区分你的“数据包”。你可以有一个惯例,你可以发送“数据包”的长度或某种可以在数据中看不到。更准确地说,Windows TCP套接字是流式传输。UDP套接字是基于消息的。TCP套接字上的每个
send()
都只是将数据添加到流中,并且流上的
send()
recv()
之间没有1对1关系。每个
send()
在UDP套接字上发送一条不同的消息,消息上存在一对一的关系。