解决套接字问题并选择

时间:2013-03-23 21:35:26

标签: sockets select

我正在用C实现一个套接字编程项目。我正在使用

选择()

用于等待来自客户端的数据。我有两个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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

一般来说,当使用select()汇集多个套接字时,您希望使用for循环而不是使用IF分支代码。另请注意选择CHANGES 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
        }
    }   
}

您可能不希望有无限循环来为数据的套接字汇集,您可以插入一些条件,例如在其中一个套接字上接收特定数据或将特定用户输入作为退出条件。希望这会有所帮助。