c - Linux,使用Socket和读写功能,数据可以分片吗?

标签 c linux sockets network-programming system-calls

在 Linux 中,

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

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

(1 byte 表示这是文件数据) (2 byte 信息用来区分发送方,接收方) (1 byte 表示当前发送的数据大小) (DATA...................... .)

以上信息将存储在buf[] (char[])

当然,sender使用write调用发送文件数据,receiver使用read调用接收文件数据。

我想知道上面的格式在使用套接字描述符读取、写入函数时会被分片。

例如,发件人写sbuf[] = "abcdefgh"。接收者总是读取 rbuf[] = "abcdefgh" 吗? 或 rbuf[] 可以是 = "a""ab""abc" “abcd” 或 .... 什么?

最佳答案

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

关于c - Linux,使用Socket和读写功能,数据可以分片吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15470155/

相关文章:

c - linux 上的 unix 域套接字?

java - 如何通过 Android 访问 SSL 连接?

sockets - Mule ESB CE 3.5.0 TCP 重新连接策略

c - 如何在GDB模式下传递输入数据进行编程 C. 已传递参数并运行程序

c - 警告 - Expected ‘struct node **’ but argument is of type ‘struct node **’ 是什么意思?

java - 在 Linux 中执行一个 jar 文件

java - 如何在 LINUX shell 上用 Java 编译多个类文件?

c - 除非换行符在格式字符串中,否则为什么 printf 在调用后不刷新?

c++ - 使用 EnumFontFamiliesEx 函数枚举时字体过多

c++ - QT:编译qt文件的命令