【发布时间】:2015-07-23 23:04:03
【问题描述】:
在套接字上的accept() 之后,我正在尝试配置 TCP keepalive。
SockConnected = accept(SockListen, &RemoteAddr,
&RemoteLen);
/* A bit of checking goes here */
if (setsockopt (SockConnected , SOL_SOCKET, SO_KEEPALIVE,
(ST_CHAR *) &sockopt_on, sizeof (int) ) )
{
/* Error logging */
}
if (setsockopt(SockConnected , IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(sockopt_tcp_keep_idle), sizeof(sockopt_tcp_keep_idle)))
{
/* Error logging */
}
if (setsockopt(SockConnected, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(sockopt_tcp_keep_intvl), sizeof(sockopt_tcp_keep_intvl)))
{
/* Error logging */
}
if (setsockopt(SockConnected, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(sockopt_tcp_keep_cnt), sizeof(sockopt_tcp_keep_cnt)))
{
/* Error logging */
}
在为所有四个属性调用getsockopt() 之后,一切似乎都很好。我已经检查了 Wireshark 并且没有发送 Keep alive 数据包。我不得不将SOL_TCP 更改为IPPROTO_TCP,因为在为TCP_KEEPIDLE 调用setsockopt() 时,它返回了errno 92(找不到协议)。
在调用socket() 进行传出连接后,我也在做同样的事情,并且工作正常。
我正在使用 C 和 Linux。
有什么原因导致setsockopt 在接受后可能无法正常工作?
【问题讨论】:
-
您设置的值可能不是实际使用的值。平台可以调整它们。使用
getsockopt()找出实际使用的值,然后查看发生的情况是否与此一致。注意,我相信您可以在侦听套接字上执行所有这些操作,从那里它将被所有接受的套接字继承。 -
我也在监听套接字上试过了,没有运气。我会仔细检查
getsockopt()的返回值。谢谢!