如何在没有读取数据的情况下监控套接字?

时间:2015-11-19 11:50:38

标签: c sockets

我开发了一个C程序,它创建一个套接字并检查我们是否在指定的Linux接口上接收流量:

程序如下所示:

sh # ./myprogram -t 10 -i eth0

我的程序看起来像这样:

...
int main(int argc, char **argv)
{
    int s, rv;
    int opt;
    struct timeval timeout;
    fd_set fd;
    t_config c;

    while ((opt = getopt(argc, argv, "i:t:")) != -1) {
        switch (opt) {
            case 'i':
                if(optarg == NULL) {
                    usage(argv[0]);
                    return 1;
                }
                c.ifname = strdup(optarg);
                break;
            case 't':
                if(optarg == NULL) {
                    usage(argv[0]);
                    return 1;
                }
                timeout.tv_sec = atol(optarg);
                timeout.tv_usec = 0;
                printf("timeout %ld optarg=%s\n", timeout.tv_sec, optarg);
                break;
            case 'h':
            default:
                usage(argv[0]);
                return 1;
        }
    }
    s = CreateSocket(&c); // configure, create, bind socket
    FD_ZERO(&fd);
    FD_SET(s,&fd);
    while(1)
    {       
        rv = select(s+1, &fd, NULL, NULL, &timeout);        
        if(result == -1)
            printf("Error occured, err = %s",strerror(errno));
        else if(rv == 0)
        {
            printf("No frame received within %ld", timeout.tv_sec);
            somefunction();
        }
        else {/* there was data to read */}
    }
    return 0;
}

尽管我向我的界面发送了流量,但程序无法检测到流量。

1 个答案:

答案 0 :(得分:0)

根据bind之后的评论,listen(2)还不够,您也应该select(2)

另外,正如select()所说,

  

select()不会更改超时,并且可以在后续重用   但是,在每次调用之前重新初始化它是一种很好的方式   调用select()。

在BUGS部分:

  

一般来说,假设超时值是不明智的   {{1}}调用未修改,调用方应重新初始化   它在每次调用时。