2013-03-23 6 views
0

Я работаю над кодом клиентского сервера, где у меня есть два потока, выполняемые на стороне клиента (объемный и розничный), и у меня есть два порта на сервере для приема данных. Я хочу использовать 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

Вам нужно будет улучшить форматирование вашего кода и предоставить более подробный анализ сценария, который приведет к вашей проблеме, если вы хотите получить помощь. –

ответ

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; Очевидно, что второй, если он никогда не достигнут.

Смежные вопросы