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