2013-03-23 21 views
0

我正在使用C实现套接字编程项目。我正在使用select()来等待来自客户端的数据。我有两个UDP套接字,并且select()总是忽略我的一个套接字。使用C中的select实现UDP套接字

任何人都可以简要描述我应该从哪里开始寻找它?这就是我的服务器是做

waitThreshold.tv_sec = 5000; 
waitThreshold.tv_usec = 50; 
if (sd > sd1) 
    max_sd = (sd + 1); 
else if(sd1 > sd) 
    max_sd = (sd1 + 1); 
FD_ZERO(&read_sds); 
FD_SET(sd, &read_sds); 
FD_SET(sd1, &read_sds); 

ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold); 
if (ret < 0) { 
    printf("\nSelect thrown an exception\n"); 
    return 0; 
} else if (FD_ISSET(sd, &read_sds)) { 
    // code for socket one 
} else if (FD_ISSET(sd1, &read_sds)) { 
    // code for socket two 
} 
+0

袜子上有一个洞......哦,等等,不,它是一个插座。 – 2013-03-23 21:13:03

+1

这里没有足够的信息让任何人知道你做错了什么。看看你是否可以制作一个简单的例子并发布代码。你是否将两个套接字添加到相关的fd_sets? select()的第一个参数是否设置为值最高的文件描述符_plus one_? – svk 2013-03-23 21:13:41

+0

是的,它被设置为最高加1。我将在这里编辑并发布一些mycode,我无法弄清楚需要发布多少和什么内容,因为它是一个大项目 – 2013-03-23 21:18:19

回答

1

您必须设置和重置后,每次迭代

if(sd > sd1)  
     max_sd = (sd + 1); 
else if(sd1 > sd) 
     max_sd = (sd1 + 1); 
//some code 
while(1){ 
    waitThreshold.tv_sec = 5000; 
    waitThreshold.tv_usec = 50;  
    FD_ZERO(&read_sds); 
    FD_SET(sd, &read_sds); 
    FD_SET(sd1, &read_sds); 
    ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold); 
    if(ret <0) 
    { 
    printf("\nSelect thrown an exception\n"); 
    return 0; 
    } 
    else if(FD_ISSET(sd, &read_sds)) 
    { // code for socket one } 
    else if(FD_ISSET(sd1, &read_sds)) 
    { // code for socket two }</pre></code> 
} 

现在它将会解决你的问题。

+0

可能重复,这是愚蠢的,重置潜在的大数目的fds in该集合将需要时间。只需使用列表的副本:'fd_set tmp = read_sds; res = select(....); read_sds = tmp;' – chacham15 2013-07-10 02:19:33