2013-03-23 89 views
1

我实现C中的socket编程项目我使用掌握插座的问题,并选择

选择()

从客户端等待数据。我有两个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 
} 

回答

2

你写了else if,所以只有其中一个会运行。

0

一般来说,当使用select()合并多个套接字时,您希望使用for循环而不是使用IF分支代码。还要注意选择CHANGE fd_set参数(读取,写入和错误文件描述符集 - 第2,3,4个参数),并且您需要在每次select()之前重新设置它们。选择有数据插座一个相当普遍的代码布局与多个并发连接读取会是这样的:

FD_ZERO(&master_sds); 
FD_ZERO(&read_sds); 

for (i=0; i<number_of_sockets); i++){ 
    FD_SET(sd[i], &master_sds); 
    if sd[i] > max_sd { 
     max_sd=sd[i]; 
    } 
} 

for(;;){ 
    read_sds=master_sds; 
    ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold); 
    if(ret<0){ 
     printf("\nSelect thrown an exception\n"); 
     return 0; 
    } 
    for(i=0; i<max_sd; i++){ 
     if FD_ISSET(sd[i], &read_fds){ 
      // code for socket i 
     } 
    } 
} 

你可能不希望有一个无限循环池进行数据插座,可以插入一些例如接收其中一个套接字上的特定数据或特定用户输入作为退出条件。希望这可以帮助。