读取套接字行为

客户端每隔1秒后向该套接字写入5个字节。 服务器不断从套接字读取。 服务器端的缓冲区长度为10个字节。 所以function看起来像这样

read(fd, buf, 10); 

服务器每次读取5个字节。

现在客户端连续写入5个字节。 服务器是一样的。 服务器每次读取10个字节。

所以在套接字上的读取返回缓冲区中可用的字节数量。 它不会等待填满缓冲区。

它是否与SO_RCVLOWAT有关? 我读了这个套接字选项只有在select/民意调查中的一个效果。

谢谢

更新

我将SO_RCVLOWAT改为10,现在至less在接收缓冲区中等待10个字节。 所以它似乎确实与接收缓冲区的低水位有关。

但我不能将低水位设置为0.在这种情况下,它总是将其设置为1。 为什么这样呢?

10我相信实际上是缓冲区的长度,所以读取将读取多达10个字节,但可能不会得到所有内容或它可能无法填满。 我相信它实际上返回写入缓冲区的字节数。

不,通常不会等到缓冲区满了才返回。

如果还没有设置非阻塞I / O,那么read()调用将一直等到您请求的所有字节都可用,或者套接字上有错误。

如果你设置了非阻塞I / O,那么不能保证你甚至会得到5个字节 – 你可能会得到一个读取2和6 – 这取决于系统和网络时间。

如果你想填充10字节缓冲区,你可以设置SO_RCVLOWAT为10,它应该工作得很好。

即使没有可用的SO_RCVLOWAT字节(至少在linux上),poll / select也会发信号给套接字。 如果打算使用poll / select使用套接字,请注意poll / select之后的read / recv / etc …调用可能会阻塞,直到SO_RCVLOWAT字节数可用。