2012-03-07 68 views
1

你好,我尝试使用下面的代码,但它似乎没有工作,在 连接插座(袜子)我做的:SO_KEEPALIVE和轮询

struct pollfd input_fd; 
int a=1; 
setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&a,sizeof(a)); 
a=1; 
setsockopt(sock,SOL_TCP,TCP_KEEPIDLE,&a,sizeof(a)); 
a=1; 
setsockopt(sock,SOL_TCP,TCP_KEEPINTVL,&a,sizeof(a)); 
a=1; 
setsockopt(sock,SOL_TCP,TCP_KEEPCNT,&a,sizeof(a)); 
input_fd.fd = sock; 
input_fd.events = POLLIN | POLLOUT; 
input_fd.revents = 0; 
int p=poll(&input_fd, 1,-1); 

我拉LAN插头连接到远程计算机,但什么都没发生。内核似乎在轮询系统调用中休眠。这是需要的 行为,还是缺陷?

+0

你还对插座做了什么?只使用'socket'创建它,或者还可以监听/绑定/连接? – ugoren 2012-03-07 15:21:07

+0

你等了多久?默认的存活超时时间为2小时。 – 2012-03-07 15:32:57

+0

@KlasLindbäck:OP使用TCP_KEEPINTVL = TCP_KEEPIDLE = TCP_KEEPCNT = 1,除非setsockopt失败,它应该在1秒后超时(并发送最多1个探针)。 – Damon 2012-03-07 16:06:35

回答

0

集NFDs的:

int p=poll(&input_fd, sock+1 ,-1); 

而且,我不知道这些设置所允许的范围,这是值得检查setsockopt返回值。

+0

对于投票,nfds = 1是正确的。如果你使用select,那么它会是sock + 1。 – mark4o 2012-03-07 16:19:59

+0

。对。我应该休息一下:) – 2012-03-07 16:25:44