C Linux,使用套接字和读写功能,数据是否可以碎片化?

C Linux,使用套接字和读写功能,数据是否可以碎片化?,c,linux,sockets,network-programming,system-calls,C,Linux,Sockets,Network Programming,System Calls,在Linux中 我正在使用客户机-服务器结构编写简单的聊天程序。它还包括文件传输功能 我设计了这样的格式,当客户端将文件的数据传输到服务器时使用 (1个字节显示这是文件数据)(2个字节信息用于区分发送方和接收方)(1个字节通知当前数据发送大小)(数据………) 上述信息将存储在buf[](char[]) 当然,发送方使用写调用发送文件数据,接收方使用读调用接收文件数据 我想知道,当读写函数使用套接字描述符时,上面的格式是否会出现碎片 例如,发送方writesbuf[]=“abcdefgh”。接收器

在Linux中

我正在使用客户机-服务器结构编写简单的聊天程序。它还包括文件传输功能

我设计了这样的格式,当客户端将文件的数据传输到服务器时使用

(1个字节显示这是文件数据)(2个字节信息用于区分发送方和接收方)(1个字节通知当前数据发送大小)(数据………)

上述信息将存储在
buf[]
char[]

当然,发送方使用写调用发送文件数据,接收方使用读调用接收文件数据

我想知道,当读写函数使用套接字描述符时,上面的格式是否会出现碎片

例如,发送方write
sbuf[]=“abcdefgh”
。接收器是否总是读取rbuf[]=“abcdefgh”?
rbuf[]
可以是
=“a”
“ab”
“abc”
“abc”
或。。。。什么?

是的,它可以,也可能会。您应该考虑使用ReV和Sead,而不是读写。 使用recv,您可以设置选项MSG_WAITALL,该选项将使读取块变为块,直到可以返回全部数据。(适用于短袜流)
请查看man recv/send以了解更多信息。

假设使用tcp,则数据可以在读取之间分割。在获取所有数据之前,您可能需要在多次读取之间进行读取和缓冲。读取的返回值将告诉您该调用读取了多少字节。顺便说一句:对
write()
的调用也不一定写出指定的字节数,需要重复。始终检查系统调用返回的值。@我可以获取引用的位置吗?我从linux系统调用中查看了
read
write
。但是,它没有提到碎片,我找不到:(.提前感谢您的帮助。@podray-它有一样多(或更多)作为
read
处理tcp。tcp是面向流的,不遵守数据报边界。它可以在一个数据包中发送20个字节或2000个字节,这取决于它自己的算法。你不能指望它将如何分解数据。在
read
侧,read只返回存在的字节数(达到你指定的限制)在tcp缓冲区中。同样,它可以是1字节或10000字节。无论是tcp还是
read
都不知道程序认为什么是消息。它只是一个长的字节流。