recv из бесконечной проблемы получения - PullRequest
1 голос
/ 19 ноября 2010

Я пишу сервер, используя сокет udp. После того, как клиент отправил первое сообщение для подключения, я открываю новый сокет для связи с этим клиентом на этом сокете (первые сокеты для прослушивания) и создаю поток для каждого клиента. Но в потоке цикл while работает бесконечно, потому что recvfrom получает данные каждый раз, когда любой клиент отправляет данные. В чем проблема в моем коде?

Пример кода ниже:

int main()
{

    .....

      // creating socket
 if( (sock = socket(AF_INET, SOCK_DGRAM, 0) ) == -1 )
 {
  perror("Socket cannot be created\n");
  return FAILURE;
 }

    .....

        for(; ;)
 {

  // TAKE CLIENTS INFORMATION
  /**************************************/ 
  recvfrom(sock, &client, sizeof(Client), MSG_WAITALL, (struct sockaddr *)&clientAddr, &size);  //1 

       .......

                if( (sock2 = socket(AF_INET, SOCK_DGRAM, 0) ) == -1 )
  { 
   perror("Socket cannot be created\n");
   return FAILURE;
  }

                client.sock = sock2;

                ...

               pthread_create(thid+num_client-1, NULL, messanger, (void*)(clients + num_client-1));


        } // end of for loop
 }// end of main


// thread function
void *messanger(void *argClient)
{
     Client client = *(Client*)argClient;
     ...

     while(strcmp(message.buffer, "exit") != 0)
     { 
 recvfrom(client.sock, &message, sizeof(Message), MSG_WAITALL, (struct sockaddr *)&clientAddr, &size);
 printf("%s\n", message.buffer);

     }// this file loops infinetely altough client does not send data. Printf prints onln new line

}

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Где у вас bind() второй сокет (или первый, если на то пошло)? Почему вы не проверяете recvfrom() на неудачу?

В любом случае, это не способ написания UDP-сервера. Вы используете один сокет для получения всех пакетов. Затем вы проверяете адрес отправителя, сопоставляете его с нужным клиентом и обрабатываете его соответствующим образом (например, вы можете поместить его в рабочую очередь для потока для каждого клиента, а затем активировать этот поток с помощью pthread_cond_signal()).

0 голосов
/ 19 ноября 2010

Ты занят - ждешь.Попробуйте использовать опрос или выберите вместо этого.

...