当我在服务器端写N次时,我应该读N次吗?

时间:2015-01-14 16:04:50

标签: linux sockets network-programming

这样的服务器:

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

客户方:

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

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

  

当你在服务器上调用N write()时,它没有必要,应该有N.   在另一边读取()电话。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

read()将返回读取的字节数。如果您始终知道要预期的数据量,则需要读取(),然后检查返回以验证是否已读取全部数量。如果不是,请再次阅读,直到您收到了预期的其他数据为止。