Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步C UDP客户端_C_Sockets_Asynchronous_Network Programming_Epoll - Fatal编程技术网

异步C UDP客户端

异步C UDP客户端,c,sockets,asynchronous,network-programming,epoll,C,Sockets,Asynchronous,Network Programming,Epoll,我正在尝试创建异步高性能UDP客户端。我正在实施 假设我有1000个torrent哈希。假设UDP跟踪器没有任何限制,我需要进行1000/74~=14个UDP请求。UDP跟踪协议通过UDP协议支持每个请求最多74个哈希,所以我需要创建14个UDP套接字 我需要使用,而不是、、或 我找到的每个epoll UDP示例都是针对服务器的,而不是针对客户端的 我在理解应用程序逻辑方面遇到困难 首先,我需要创建14个套接字: #define MAX_CLIENTS 14 int fd[MAX_CLIENTS

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

假设我有1000个torrent哈希。假设UDP跟踪器没有任何限制,我需要进行1000/74~=14个UDP请求。UDP跟踪协议通过UDP协议支持每个请求最多74个哈希,所以我需要创建14个UDP套接字

我需要使用,而不是、、或

我找到的每个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]); 
}
现在,我需要通过每个套接字发送数据,并通过epoll接收结果。我该怎么做

我不需要别人为我写代码,我只是想更好地理解epoll逻辑

这是一个高度理论化的问题,因此我可以更好地理解epoll。请不要让我参考pthreads或libevent,这不是我的问题。另外,我对Torrent Tracker协议的HTTP实现不感兴趣。

类似的线程:


  • 要在特定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。 您可以像以前一样打开不同的fd,将它们添加到fd集合并使用select。 然后您可以使用FD_ISSET来确定哪个FD有数据 请参阅手册页,它非常有用

    另外,在评论中回答您的问题


    “我会以任何特定顺序接收数据吗?我能解析它吗?”

    IP world对订单没有任何保证。它是一个无连接的世界数据丢弃和ECMP,有时可以确保数据不被排序:)


    读取、recv、recvfrom后,数据将保存在一个缓冲区中,可以轻松解析。

    您应该在一个套接字上完成所有操作。由于UDP是无连接的,因此您可以对所有发送和接收重复使用同一个套接字—您只需在每次sendto()时显式传递地址,还可以选择使用recvfrom()来知道谁回复了您。

    为什么需要14个套接字?UDP是无连接的,所以你不能用一个套接字(也许没有epoll)来完成所有事情吗?听起来不错:)我认为你是对的。。。你能回答吗?我会以任何特定的顺序接收数据吗?我能解析它吗?如果你能帮助的话,当然不要使用这些原始的OS API。使用像libevent、libev或libuv或Boost Asio这样的包装库。它们使这一切变得相当容易。@JohnZwinck当您的服务器支持多个客户端时,必须使用多个套接字。有一个主套接字用于侦听,但是accept()命令会为每个传入的客户端消息创建多个工作套接字。UDP是无连接的并不意味着套接字连接不会持续多长时间来读取和响应传入消息。在这段时间里,可能会有10多个客户端发送了新的数据报。多个输入套接字通常是一个数组(在select()中使用),这意味着接收每个客户端的数据报并发送响应。我不是在写服务器,而是在写客户端。我不需要绑它。另外,我需要使用epoll而不是select。没有选择!要控制本地端口,绑定是个好主意。
       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));