Tag: epoll

使用epoll的多个UDP套接字 – 无法接收数据

我试图使用epoll从多个UDP套接字接收数据。 这是一个测试程序,它没有确切数量的套接字。(为了测试目的,它设置为50.)下面的程序没有收到任何数据,它被卡在epoll_wait(),因为我已经给它-1等待直到得到数据。 但是没有得到任何。 #include #include #include #include #include #include #include #include #include #include #define MAX_CON (50) typedef struct UDPMessage { unsigned short hdr; unsigned short CC1; unsigned short CC2; unsigned char data[1472]; unsigned short CC3; } UDPPacket; static struct epoll_event *events; int create_sockets(unsigned int port); int create_sockets(unsigned int port) { int sock, flag = 1; […]

在基于epoll的服务器中超时空闲连接

我在c中编写了一个tcp服务器,它使用epoll()i / o多路复用来管理并发连接。 我想超时空闲超过允许时间的连接。 到目前为止,我保留了与每个连接关联的last_active time_t变量,我将其更新为事件处理程序中的当前时间。 在此之前,我检查自上次事件以来是否超过允许的时间,如果是,我终止连接。 到目前为止一切都那么好,但它并不是我想要的,因为超时仅在第一个超时事件中触发,但如果连接保持不活动状态,我的代码在它再次变为“活动”之前不会检测到它。 我在基于select()的服务器中看到这种方式的方法是在事件循环的每次迭代期间线性遍历兴趣集并清除那里的非活动连接。 这在选择中不是问题,因为你已经必须进行此遍历,但我正是使用epoll()来避免必须这样做。 如果我这样做,epoll并不比选择更好。 我也查看了套接字选项,我发现最接近的是SO_RCVTIMEO,这使得read()/ recv()如果等待超过指定时间则返回错误。 但由于我正在使用i / o多路复用并且套接字处于非阻塞模式,因此不会阻塞,因为套接字不会阻塞。 我很感激有关如何解决这个问题的任何见解。 非常感谢你。

确定哪个信号导致EINTR?

我正在运行一个epoll循环,有时我对epoll_wait的调用返回-1,并将errno设置为EINTR。 有时,我想要结束epoll循环,就像SIGTERM或SIGINT一样。 但是我用-pg标志编译了这个代码,因此引发了周期性的SIGPROF(27)信号,停止了我的循环。 那么……是否可以打开百分号以便我可以确定何时退出而不是继续? 我想避免使用全局来跟踪最近发出的信号的任何事情。

关于epoll_ctl()

当使用epoll_ctl()时,我发现第三个参数“fd”是epoll文件描述符“epfd”之外的另一个文件描述符。 我看到了这样一个例子: event.data.fd = sfd; //sfd is a fd for listening event.events = EPOLLIN | EPOLLET; s = epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event); 正如我所看到的,event.data.fd中的文件描述符与epoll_ctl中的第三个参数相同,为什么需要两次传递这个描述符? 有什么区别吗?

C:epoll和multithreading

我需要创建专门的HTTP服务器,为此我计划使用epoll sycall,但我想利用多个处理器/核心,我无法提出架构解决方案。 ATM我的想法是跟随:用自己的epoll描述符创建多个线程,主线程接受连接并在线程epoll之间分配它们。 但有没有更好的解决方案? 我可以在高负载架构上阅读哪些书籍/文章/指南? 我只看过C10K的文章,但大多数链接到例子已经死了:(并且仍然没有关于这个主题的深入的书籍:(。 谢谢你的回答。 UPD:请更具体一点,我需要材料和示例(nginx不是一个例子,因为它太复杂,并且有多个抽象层来支持多个系统)。

Linux,C,epoll(),read()数据未完成?

Linux,C。下面的问题只发生在使用epoll()。 如果我在服务器套接字上使用select(),则不会丢失数据。 ============================= 更新:我在read()中收到了errno = 11(再试一次)。 我需要继续,还是打破while循环? ============================= 我有客户端,10次发送1280 K数据(每次发送128K数据); 我有服务器端,使用epoll()来监视传入的数据。 收到通知后,我使用下面的代码来读取数据: nbytes = Nread(current_fd, buffer, bytes_to_be_read); int Nread(int fd, char *buffer, size_t count) { ssize_t r; size_t left = count; printf(“===>\n”); while (left > 0){ r = read(fd, buffer, left); printf(“data: %ld\n”, r); if (r done, %ld\n”, total – left); return count – left; […]