套接字SO_RCVTIMEO超时是C++/VC++中设置值的两倍

Socket SO_RCVTIMEO Timeout is double the set value in C++/VC++

本文关键字:设置 两倍 VC++ RCVTIMEO SO 超时 C++ 套接字      更新时间:2023-10-16

请显示以下示例

int val = 120000;
setsockopt(connSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&val,sizeof(int));

我在接收超时时设置了120秒,但它需要240秒。

我认为超时是设定值的两倍。

这怎么可能?

SO_RCVTIMEO不接受int作为超时。你正在寻找这样的东西:

struct timeval tv = {
    .tv_sec = 120
};
setsockopt(connSock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

SO_RCVTIMEO和SO_SNDTIMEO不适用于所有套接字操作,您应该使用非阻塞模式和select

行为可能会在不同的操作系统配置上发生变化。在我的系统上,connect在两倍于我在SO_RCVTIMEO中设置的值后超时。一个快速的破解方法,比如在连接前将SO_RCVTIMEO设置为x/2,在连接后设置为x,但正确的解决方案是使用select。

参考文献

关于这个问题的讨论(阅读评论以回答):

  • https://stackoverflow.com/a/4182564/4074995

如何使用选择来获得所需的结果:

  • http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select
  • C: 套接字连接超时