[英]UDP epoll detects the data only from single port
我試圖實現一個程序來了解 UDP epoll 的實際工作。 我已經完成了如下代碼。 這適用於單個套接字。 但是當我嘗試使用多個套接字時(比如 4 sockets 代表 10000、10001、10002、10003),它只檢測到最后一個套接字上的數據(這里是第 4 個,即 10003)。 有人看我的代碼,讓我知道這里有什么問題嗎?
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/epoll.h>
#define MAX_EVENTS 20
#define MAXLINE 1024
int get_new_socket(int port)
{
int sockfd;
struct sockaddr_in servaddr;
if ((sockfd = socket(PF_INET, SOCK_DGRAM /*|SOCK_NONBLOCK|SOCK_CLOEXEC*/, IPPROTO_UDP)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(port);
if (bind(sockfd, (const struct sockaddr *)&servaddr,
sizeof(servaddr)) < 0 )
{
perror("bind failed");
exit(EXIT_FAILURE);
}
return sockfd;
}
void recv_send_data(int sockfd)
{
char buffer[MAXLINE];
char *hello = "Hello from server";
struct sockaddr_in cliaddr;
int ret;
memset(&cliaddr, 0, sizeof(cliaddr));
int len = sizeof(cliaddr), n = 17;
n = recvfrom(sockfd, (char *)buffer, MAXLINE, 0, (struct sockaddr *)&cliaddr, &len);
perror("recvfrom");
buffer[n] = '\0';
printf("[%d]Client : %s\n", n, buffer);
ret = sendto(sockfd, (const char *)hello, 17, 0, (const struct sockaddr *)&cliaddr, len);
printf("sent back to client.[%d]\n", ret);
}
int main(int argc, char *argv[]) {
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, nfds, epollfd, n;
int start_port = 10000;
for(n = start_port; n < start_port + 4; n++) {
listen_sock = get_new_socket(n);
printf("Created socket[%d] for port %d\n", listen_sock, n);
epollfd = epoll_create1(0);
if (epollfd == -1) {
perror("epoll_create");
exit(EXIT_FAILURE);
}
ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}
}
for (;;) {
printf("Waiting on epoll\n");
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_pwait");
exit(EXIT_FAILURE);
}
printf("EPOLL wait over; processing...\n");
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
printf("Data received on: %d, listen_sock: %d\n", events[n].data.fd, listen_sock);
recv_send_data(listen_sock);
}
}
sleep(1);
}
}
為什么要為每個 FD 創建 epoll。 您只需要使用 epoll_create 創建一個 epoll 並用於所有 fd。
epollfd = epoll_create1(0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.