客户端每隔1秒后向该套接字写入5个字节。 服务器不断从套接字读取。 服务器端的缓冲区长度为10个字节。 所以function看起来像这样
read(fd,buf,10);
服务器每次读取5个字节。
现在客户端连续写入5个字节。 服务器是一样的。 服务器每次读取10个字节。
所以在套接字上的读取返回缓冲区中可用的字节数量。 它不会等待填满缓冲区。
如何在Linux中“互连”两个套接字?
非阻塞套接字和发送()
Linux C / C ++套接字发送multithreading代码
在Windows中为套接字使用特定的networking接口
select()可以在Windows中处理的套接字的最大数量是多less?
它是否与SO_RCVLOWAT有关? 我读了这个套接字选项只有在select/民意调查中的一个效果。
谢谢
更新 :
我将SO_RCVLOWAT改为10,现在至less在接收缓冲区中等待10个字节。 所以它似乎确实与接收缓冲区的低水位有关。
但我不能将低水位设置为0.在这种情况下,它总是将其设置为1。 为什么这样呢?
UDP多播:由计算机接收,但不是由应用程序接收
我们是否需要添加locking接收/发送/closures代码线程之间相同的sockets
Unix vs BSD vs TCP vs Internet套接字?
设置接受的套接字的缓冲区大小
Linux孤儿套接字监听器的问题
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字节数可用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。