【问题标题】:Linux, using Socket and read write functions, can data fragmented?Linux,使用Socket和读写功能,数据可以分片吗?
【发布时间】: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 中查看了readwrite。但是,它没有提到碎片,我找不到:(。提前感谢您的帮助。
  • @podray - 它与 tcp 的关系与read 一样多(或更多)。 tcp 是面向流的,不支持数据报边界。它可以在一个数据包中发送 20 个字节或 2000 个字节,具体取决于它自己的算法。你不能指望它将如何分解数据。在read 一侧,读取将返回 tcp 缓冲区中存在的字节数(达到您指定的限制)。同样,它可以是 1 字节或 10000 字节。 tcp 和read 都不知道您的程序认为什么是消息。它只是一个长长的字节流来来去去。

标签: c linux sockets network-programming system-calls


【解决方案1】:

是的,它可以,而且可能会。您应该考虑使用 recv 和 send 而不是 read 和 write。 使用 recv 您可以设置选项 MSG_WAITALL,这将使读取块直到可以返回全部数据量。 (对于 SOCK_STREAM) 请查看 man recv/send 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多