在服务器端写N次时是否应该读N次

Should I read N times when I write N times at server side

这样的服务器:

char buf[10];                                                               
memset(buf, 0, 10);
write(sock, "te", 2); 
write(sock, "ab", 2);

客户端:

char buf[5] = {0};
read(connfd, buf, 5);

如果小于 2 + 2,我的意思是 5,但结果显示我只收到 2 个字节,即 "te"。 这个链接 read() is not blocking in socket programming 告诉我

When you call N write() at server its not necessary there should be N read() call at other side.

我的理解或代码有什么问题?我应该使用另一个系统调用还是其他东西。

read() 将 return 读取了多少字节。在您始终知道预期有多少数据的情况下,您想要 read(),然后检查 return 以验证是否读取了全部数据。如果不是,请再次阅读,直到收到您期望的其余数据。

当使用面向流的套接字(如 TCP)时,无法保证读取和写入的数量。这意味着一次写入可以通过多次读取来读取,而多次写入可以通过一次读取来读取。通常,如果写入时间短且间隔较短,则每次写入都会有一次读取,但这并不能保证。这里你只读了 2 个字节。那可能会发生,你只需要再调用一两个 read 即可。请注意,如果您使用的是环回接口,读取和写入调用可能非常匹配,因此每次写入可能只有一个读取调用,但同样您不能确定。通常的模式是继续循环读取,直到获得所需的字节数。

如果您使用的是面向数据报的套接字,如 UDP,一次写入将正好是一次读取(如果传输成功),如果提供的读取缓冲区太短,则会丢弃一些数据。