这是一个关于Unix套接字的家庭作业问题,我试图在谷歌上找到解决方案,但我什么也没找到。
这个问题来自Linux编程接口电子书,57.1
我们注意到UNIX域数据报套接字是可靠的。编写程序来表明,如果发送方向UNIX域数据报套接字传输数据报的速度比接收方读取数据报的速度快,那么发送方最终会被阻塞,并保持阻塞状态,直到接收方读取一些挂起的数据报。
我认为我必须得到正确的系统调用来给予这个练习的解决方案
- Linux系统调用中已经存在的用于在等待接收方接收数据包时阻止发送方的函数是什么?
1.发送方如何知道接收方成功接收到数据包,以便系统允许发送方继续发送新数据包?
1条答案
按热度按时间tzdcorbm1#
1.当接收器饱和时,所有向套接字写入数据的Linux函数都会阻塞,除了异步引擎函数(
io_submit()
,io_uring_enter()
等)和显式配置为返回错误而不是阻塞的套接字(O_NONBLOCKING
标志)。写入套接字的Linux函数有:write()
、send()
、sendto()
、sendmsg()
、sendfile()
及其变体,如writev()
、sendmmsg()
等。在调用send函数之前,检查某个套接字是否没有被接收方阻塞是非常重要的,否则程序将阻塞等待套接字恢复操作(尽管在这种情况下,这正是练习所要求的)。send(2):当消息不适合套接字的发送缓冲区时,send()通常会阻塞,除非套接字处于非阻塞I/O模式。
1.接收方必须明确地或隐含地告诉发送方它已饱和。例如,TCP套接字将停止应答确认数据包。在Unix域套接字的情况下,通信是服务器本地的,由简单的缓冲区组成。当套接字缓冲区中的可用空间低于预定义的“低水位线”值时,接收方隐式地指示饱和,默认值为1(
SO_SNDLOWAT
和SO_RCVLOWAT
套接字选项)。socket(7):指定缓冲区中的最小字节数,直到套接字层将数据传递给协议(SO_SNDLOWAT)或接收时的用户(SO_RCVLOWAT)。