+ -
当前位置:首页 → 问答吧 → 在client端setsockopt设置 keepalive不起作用的原因

在client端setsockopt设置 keepalive不起作用的原因

时间:2010-08-10

来源:互联网

本帖最后由 灰菲湮灭 于 2010-08-10 16:51 编辑

结构一如下:

int flag;

fun()
{
            create_socket(); //里面设置keepalive
            flag = 1;
}



int main() {
    FD_ZERO(&rfds);
      FD_SET(nl_fd, &rfds);

       select();

      if (FD_ISSET(nl_fd)){
           fun();  
      }
       if (flag == 1) {
              write_sock();
               read_sock();
        }
}



结构二如下:


int flag;

fun()
{
            create_socket(); //里面设置keepalive
            flag = 1;
}

test()
{
        write_sock();
         read_sock();
}

int main() {

    FD_ZERO(&rfds);
      FD_SET(n_fd, &rfds);
      if (flag == 1) {
               FD_SET(fd, &rfds);
       }

       select();

      if (FD_ISSET(nl_fd)){
           fun();  
      }
       if (flag == 1) {
             if (FD_ISSET(nl_fd)){
                    test();  
             }
        }
}






如上所示: 以上结构都有两个socket: fd和nl_fd;   结构一将fd和nl_fd都放入select,结构二只把fd放入select

在结构二中keepalive 是可以正常作用,可以发现server端异常断开。但结构一却不行。两种结构用的同一个server测试。

而且还有一点很奇怪,如果把结构一中的write_socket注掉,则可以发现异常中断。


请问这是什么原因呢?

非常感谢。

作者: 灰菲湮灭   发布时间: 2010-08-10

或者结构不删除write_socket,把read_socket和write_socket调换一个位置也是可以的,很奇怪,不知道为什么。。。

作者: 灰菲湮灭   发布时间: 2010-08-10

结构一:
FD_SET(nl_fd, &rfds);//这里设置了
结构二:
if (flag == 1) {
               FD_SET(fd, &rfds);//这里还没设置
       }

是不是还和select 的读写参数有关,不知道LZ 具体是怎么设置的

作者: lqq_1229   发布时间: 2010-08-10

fun() 函数里设置flag
create_socket();里面  fd = socket();

这个程序主要有两个socket,一个fd,  一个nl_fd;

结构一里面把两个socket全加入到select里面。

结构二里面只把nl_fd加入,fd并没有加入,只是根据flag判断是否去write/read。

作者: 灰菲湮灭   发布时间: 2010-08-10