2010-11-19 11 views
1

Udp soketi kullanarak bir sunucu yazıyorum. Bir istemcinin bağlantı kurmak için ilk mesajı gönderdikten sonra, bu soket üzerinde bu istemci ile iletişim kurmak için yeni soket açın (ilk soketler için) ve her istemci için bir iş parçacığı oluşturun. Ancak iş parçacığında, süre döngüleri sonsuza kadar sürüyor, çünkü her müşteri veri göndermesine rağmen her zaman veri alıyor. Kodumdaki sorun nedir?sonsuz alıcı sorununu geri getiriyor

aşağıdaki kod örneği:

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 

} 

cevap

1

Nerede da birden bind() ikinci soket (ya da bu konuda, ilk)? Neden başarısızlık için recvfrom() kontrol etmiyorsun?

Bu, bir UDP sunucusunu yazmanın yolu değil. Tüm paketleri almak için tek bir soket kullanırsınız. Daha sonra gönderici adresini denetleyin, doğru istemciyle eşleştirin ve uygun şekilde işleyin (örneğin, bir istemci iş parçacığı için bir iş kuyruğuna koyabilirsiniz, daha sonra bu iş parçacığını pthread_cond_signal() kullanarak uyandırın).

+0

hmm. Bunu deneyeceğim. Çözümümden de memnun kalmamıştım. Ancak tcp sunucusunda, kabulden döndürülen fd sayısı daha kolay çalışır. Bu yüzden bu fd numarasında belirli bir müşteri ile iletişim kurabilirim. Bu şekilde davranmaya çalıştım ama yolun bu olmadığını görüyorum. Cevaplar için teşekkürler – cemal

0

Meşgul müsünüz. Anketi kullanmayı deneyin veya bunun yerine seçin.