C语言:如何监听多个UDP端口

3

我正在开发的应用程序需要能够监听多个(目前是4个)端口号。我需要为每个端口创建一个套接字吗,例如:

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()语句,这是我应该使用的吗?我监听多个端口的原因很简单,它应该能够识别我正在通信的应用程序。例如,每个端口一个应用程序。

感谢您提前的评论。

// 更新: 如何为每个端口设置一个套接字?

1个回答

5

是的,如果您希望通过每对(IP,端口)号通信,则需要为每个对使用单独的套接字。

当您设置好所有套接字后,确实可以使用select()函数(它不是“语句”,这意味着它在某种程度上是该语言的一部分,它只是库中的一个函数)来服务于多个套接字。


你能简要介绍一下如何设置套接字及其对应的端口吗?每当我尝试为每个端口设置一个套接字时,就会出现“地址已在使用”的错误。 - nyyrikki
可能是您正在尝试将套接字绑定到已被另一个应用程序使用的端口。有关C套接字的详细信息和示例,请查看此处:http://www.linuxhowtos.org/C_C++/socket.htm - fduff
1
设置SO_REUSEADDR也可以很好地防止端口被占用,例如在程序崩溃后。 - Walter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接