异步C UDP客户端

时间:2014-08-10 14:38:58

标签: c sockets asynchronous network-programming epoll

我正在尝试创建异步高性能UDP客户端。我正在实施UDP tracker protocol

让我们说我有1000个洪流哈希。我需要做出1000/74~ = 14个UDP请求假设UDP跟踪器没有任何限制。 UDP Tracker协议通过UDP协议支持每个请求最多74个哈希,因此我需要创建14个UDP套接字。

我需要使用epoll,而不是pollselectlibeventlibevlibuv

我找到的每个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实现不感兴趣。

类似的主题:

  1. Could you recommend some guides about Epoll on Linux
  2. Is there any good examples or tutorial about epoll UDP
  3. Multiple UDP sockets using epoll - Not able to receive data

2 个答案:

答案 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之后,您将把数据放在缓冲区中,您可以轻松解析。