我开发了一个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;
}
尽管我向我的界面发送了流量,但程序无法检测到流量。
答案 0 :(得分:0)
根据bind
之后的评论,listen(2)
还不够,您也应该select(2)
。
另外,正如select()
所说,
select()不会更改超时,并且可以在后续重用 但是,在每次调用之前重新初始化它是一种很好的方式 调用select()。
在BUGS部分:
一般来说,假设超时值是不明智的 {{1}}调用未修改,调用方应重新初始化 它在每次调用时。