【给出答案】
1. UDP也可以使用select/epoll;
2. 但是,通常没有这个必要。Richard Stevens在不朽的经典《Unix网络编程卷一》中已经说了:“大多数情况下,TCP服务器是并发的,UDP的服务器是迭代的。”说白了,UDP没有必要使用多路复用。
【网络编程模型(伪代码)】
1. TCP(多路复用模型):
srv_sock = create(); bind(srv_sock, srv_addr); listen(srv_sock, max_connections); //设定最大连接数 fd_set myset; max_fd = srv_sock; while (1) { FD_ZERO(&myset); select(max_fd+1, &myset); //注意,myset是输出参数,不是输入参数 for (fd = 0; fd < max_fd; ++fd) { if (FD_ISSET(myset, fd)) { if (fd == srv_sock) //1. 新连接 { cli_sock = accept(srv_sock); max_fd = max(max_fd, cli_sock); } else //2. 连接可读 { recv(fd); //TCP使用recv } } } }
2. UDP(迭代模型):
srv_sock = create(); bind(srv_sock, srv_addr); while (1) { int ret = recvfrom(srv_sock, &client_addr); //UDP使用recvfrom;注意,client_addr是输出参数,不是输入参数 ... ... }
【参考】
1. 《Unix网络编程卷一》. 22.7节 UDP并发服务器. Richard Stevens
2. 《Unix网络编程卷一》. 第8章 UDP网络编程. Richard Stevens