【发布时间】:2013-03-06 09:29:58
【问题描述】:
在 Linux 中,
我正在使用客户端-服务器结构编写简单的聊天程序。它还包括文件传输功能。
我设计了当客户端像这样将文件数据传输到服务器时使用的格式。
(1 字节显示这是文件数据) (2 字节信息区分发送者、接收者) (1 字节告知当前数据发送大小) (DATA....... .)
以上信息将存储在buf[] (char[])
当然,发送方使用写调用发送文件数据,接收方使用读调用接收文件数据。
我想知道上述格式在使用套接字描述符的读取、写入函数时会被分片。
例如,发件人写sbuf[] = "abcdefgh"。接收者是否总是读取rbuf[] = "abcdefgh"?
或rbuf[] 可以是= "a" 或"ab" 或"abc" 或"abcd" 或....什么?
【问题讨论】:
-
假设 tcp,是的,数据可以在读取之间分段。在获取所有数据之前,您可能必须在多次读取之间进行读取和缓冲。读取的返回值将告诉您该调用读取了多少字节。
-
顺便说一句:对
write()的调用也不一定写出指定的字节数,需要重复。始终检查系统调用返回的值。 -
@Duck 我可以得到参考在哪里吗?我从 linux 系统调用linux manual 中查看了
read、write。但是,它没有提到碎片,我找不到:(。提前感谢您的帮助。 -
@podray - 它与 tcp 的关系与
read一样多(或更多)。 tcp 是面向流的,不支持数据报边界。它可以在一个数据包中发送 20 个字节或 2000 个字节,具体取决于它自己的算法。你不能指望它将如何分解数据。在read一侧,读取将返回 tcp 缓冲区中存在的字节数(达到您指定的限制)。同样,它可以是 1 字节或 10000 字节。 tcp 和read都不知道您的程序认为什么是消息。它只是一个长长的字节流来来去去。
标签: c linux sockets network-programming system-calls