2013-03-23 122 views
0

我正在处理客户端服务器代码,其中有两个线程在客户端(bulk和retail)运行,并且在服务器有两个端口用于接收数据。我想在服务器端使用select(),但由于在“sd1 - 这是散装端口”上永远不会收到数据,所以会出现一些错误。如果有人能够帮助我解决当前代码的问题,我将非常感激。谢谢!!在多个客户端的服务器端select()

int main(int argc, char *argv[]) { 

fd_set readfds, activefds; 

// SOCKET CREATION RETAIL 
sd=socket(AF_INET, SOCK_DGRAM, 0); 
if(sd<0) { 
printf("error creating retail socket \n"); 
return -1; 
} 

// SOCKET CREATION BULK 
sd1=socket(AF_INET, SOCK_DGRAM, 0); 
if(sd1<0) { 
printf("error creating retail socket \n"); 
return -1; 
} 

// BIND RETAIL PORT 
servAddr.sin_family = AF_INET; 
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servAddr.sin_port = htons(RETAIL_PORT); 
rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); 
if(rc<0) { 
printf("error binding retail port number %d \n",RETAIL_PORT); 
return -1; 
} 

// BIND BULK PORT 
servAddr.sin_family = AF_INET; 
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servAddr.sin_port = htons(BULK_PORT); 
rc1 = bind (sd1, (struct sockaddr *) &servAddr,sizeof(servAddr)); 
if(rc1<0) { 
printf("error binding bulk port number %d \n",BULK_PORT); 
return -1; 
} 

int nfds; 
if(sd>sd1){ 
nfds = sd;} 
else{ 
nfds = sd1;} 

FD_ZERO(&activefds); 
FD_SET(sd, &activefds); 
FD_SET(sd1, &activefds);  

    while(1){ 

    readfds = activefds; 

    if (select(nfds+1, &readfds, NULL, NULL, NULL) < 0){ 
    perror("select"); 
    break; 
    } 

     for(i=0;i<nfds;i++){ 

    if(FD_ISSET(i, &readfds)){ 
    printf("sd = %d\n\n\n",sd); // sd = 3 getting printed here 
    if(i == sd){ 
     n = recvfrom(sd, &requested_retail_cases, 4, 0, (struct sockaddr *) &cliAddr, &cliLen); 
      printf("in retail\n"); 
      } 

    else if(FD_ISSET(i, &readfds)){ 

    if(i == sd1){ 

    n1 = recvfrom(sd1, &requested_bulk_cases, 4, 0, (struct sockaddr *) &cliAddr, &cliLen); 
    } 

    } 
} 
} 
return 1; 
} 
+0

如果您需要帮助,您将不得不改进代码的格式并提供导致问题的场景的更详细分析。 – 2013-03-23 19:15:20

回答

0

变化

if(FD_ISSET(i, &readfds)){ 
    if(i == sd){ 
     ... 
    } 
else if(FD_ISSET(i, &readfds)){ 
    if(i == sd1){ 
     ... 
    } 
} 

if(FD_ISSET(i, &readfds)){ 
    if(i == sd){ 
     ... 
    } 
    else if(i == sd1){ 
     ... 
    } 
} 

目前的情况是在你的代码,第二外,如果从未达到。你实际上有if (x) then y; else if (x) then z;显然,第二个如果从未达到。