Linux C套接字选项

套接字选项:

  • SO_RCVTIMEO:用来设置socket接收数据的超时时间;
  • SO_SNDTIMEO: 用来设置socket发送数据的超时时间;

一般地,调用accept/connect/send/recv, 进程会阻塞,但是如果对端异常,进行可能无法正常退出等待。如何让这些调用自动定时退出?

可用socket套接字选项SO_RCVTIMEO和SO_SNDTIMEO,仅针对与数据接收和发送相关,而无需设置专门的信号捕获函数。

能作用的系统调用:send、sendmsg、recv、recvmsg、accept、connect。

注意:

1)EAGAIN通常和EWOULDBLOCK是同一个值;
2)SO_RCVTIMEO, SO_SNDTIMEO不要求系统调用对应fd是非阻塞(nonblocking)的,但是使用了该套接字选项的sock fd,会成为nonblocking(即使之前是blocking)的。参见man手册ERRORS EAGAIN/EWOULDBLOCK描述;

系统调用有效选项系统调用超时后的行为
send SO_SNDTIMEO 返回-1,设置errno为EAGAIN或EWOULDBLOCK
sendmsg SO_SNDTIMEO 返回-1,设置errno为EAGAIN或EWOULDBLOCK
recv SO_RCVTIMEO 返回-1,设置errno为EAGAIN或EWOULDBLOCK
recvmsg SO_RCVTIMEO 返回-1,设置errno为EAGAIN或EWOULDBLOCK
accept SO_RCVTIMEO 返回-1,设置errno为EAGAIN或EWOULDBLOCK
connect SO_SNDTIMEO 返回-1,设置errno为EINPROGRESS
注意:

1)EAGAIN通常和EWOULDBLOCK是同一个值;
2)SO_RCVTIMEO, SO_SNDTIMEO不要求系统调用对应fd是非阻塞(nonblocking)的,但是使用了该套接字选项的sock fd,会成为nonblocking(即使之前是blocking)的。参见man手册ERRORS EAGAIN/EWOULDBLOCK描述;

原始套接字(SOCK_RAW)

posted @ 2025-09-29 10:13  PKICA  阅读(5)  评论(0)    收藏  举报