2012-05-15 320 views
2

我正在處理的應用程序應該能夠偵聽多個(現在4個)端口號。我需要爲每一個這些端口創建一個套接字,如:C /如何偵聽多個UDP端口

if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 
    perror("error: could not create UDP socket\n"); 
    exit(EXIT_FAILURE); 
} 

bzero(&sock_addr, sizeof(sock_addr)); 
sock_addr.sin_family = AF_INET; 
sock_addr.sin_port  = htons(port1); 
sock_addr.sin_addr.s_addr = inet_addr(INADDR_ANY); 

if(bind(sock_fd, (struct sockaddr *) &sock_addr, sock_len) < 0) { 
    perror("error: could not bind UDP socket to AU\n"); 
    exit(EXIT_FAILURE); 
} 

或者是有一個更優雅的方式來做到這一點?我還讀了關於select()聲明,這是我應該使用的東西嗎?我想聽幾個端口的原因很簡單,它應該識別我正在與之通信的應用程序。例如。每個端口一個應用程序

在此先感謝您的意見。

//更新: 我應該如何爲每個端口設置一個套接字?

回答

4

是的,您需要爲希望通過的每對(IP,端口)號碼分開套接字。

是的,你可以絕對使用select()函數(它不是一個「聲明」,它暗示着某種語言的一部分,它只是庫中的一個函數),一旦你設置了所有的套接字向上。

+0

您可以簡單介紹一下如何設置套接字及其對應的端口嗎?每當我嘗試爲每個端口設置一個套接字時,就會出現':Address already in use'錯誤。 – nyyrikki

+0

它可能是你試圖綁定你的套接字已經被另一個應用程序使用的端口。有關C套接字的詳細信息和示例,請在此處查看:http://www.linuxhowtos.org/C_C++/socket.htm – fduff

+1

設置SO_REUSEADDR對於停留在使用中的端口也有幫助 - 例如程序崩潰後。 – Walter