我正在尝试创建异步高性能UDP客户端。我正在实施UDP tracker protocol。
让我们说我有1000个洪流哈希。我需要做出1000/74~ = 14个UDP请求,假设UDP跟踪器没有任何限制。 UDP Tracker协议通过UDP协议支持每个请求最多74个哈希,因此我需要创建14个UDP套接字。
我需要使用epoll,而不是poll,select,libevent,libev或libuv。
我找到的每个epoll UDP示例都是针对服务器而不是客户端。
我在理解应用程序逻辑方面遇到了麻烦。
首先,我需要创建14个套接字:
#define MAX_CLIENTS 14
int fd[MAX_CLIENTS];
for (i = 0; i < MAX_CLIENTS; i++) {
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
setnonblock(fd[i]);
}
然后
int efd = epoll_create(MAX_EVENTS);
现在我需要通过sendto为每个套接字发送数据,并通过epoll接收结果。我怎样才能做到这一点 ?
我不需要有人为我编写代码,我只想更好地理解epoll逻辑。
这是一个高度理论性的问题,所以我可以更好地理解epoll。请不要把我推荐给pthreads或libevent,这不是我的问题。另外,我对Torrent Tracker协议的HTTP实现不感兴趣。
类似的主题:
答案 0 :(得分:2)
您应该只在一个插槽上执行所有操作。由于UDP是无连接的,因此您可以为所有发送和接收重复使用相同的套接字 - 每次发送到()时都只显式传递地址,并可选择使用recvfrom()来知道谁回复了您。
答案 1 :(得分:-1)
接收您需要绑定它的特定udp套接字上的数据。
int sockfd,n;
struct sockaddr_in servaddr,cliaddr;
socklen_t len;
sockfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(32000);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
然后调用recv或read。 你可以像你一样打开不同的fds,将它们添加到fd set并使用select。 然后你可以使用FD_ISSET来确定哪个fd有数据 看到man page非常有用。
另外,在评论中回答你的问题。
&#34;我会以任何特定订单接收数据吗?我可以解析它吗?&#34;
IP世界无法保证订单。它是一个无连接的世界数据丢弃和ECMP,有时确保数据不被订购:)。
在读取,recv,recvfrom之后,您将把数据放在缓冲区中,您可以轻松解析。