2012-05-15 315 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