Git   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了EBMPF在epoll_wait之后recv大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个以下问题:我有一个接收连接的epoll代码

while (1) { int nfds = epoll_wait(epollfd,events,4096,-1); if (nfds == -1) { if (errno == EINTR) conTinue; perror("epoll_wait"); exit(EXIT_FAILURE); } for (int i = 0; i < nfds; i++) { if (events[i].data.fd == server_sock) { client_sock = accept(server_sock,(struct sockaddr *)&client_name,(socklen_t *)(&client_name_len)); if (client_sock == -1) //server overloaded conTinue; ev.events = EPOLLIN | EPOLLERR; #ifdef CORE_NONBLOCKING_SOCKETS Arch::set_nonblocking(client_sock); ev.events |= EPOLLET; //input data and connection closing #endif #ifdef EPOLLRDHUP ev.events |= EPOLLRDHUP ;// #else //for old libraries ev.events |= EPOLLHUP;// #endif ev.data.fd = client_sock; if (epoll_ctl(epollfd,EPOLL_CTL_ADD,client_sock,&ev) == -1) { perror("epoll_ctl: client_socket"); exit(EXIT_FAILURE); } accept_request(client_sock); } else { #ifdef EPOLLRDHUP if (events[i].events & EPOLLRDHUp) { std::cout << "EPOLLRDHUP on " << events[i].data.fd << std::endl; listener->disconnectDriver(events[i].data.fd); } #else if (events[i].events & EPOLLHUp) { std::cout << "EPOLLHUP on " << events[i].data.fd << std::endl; listener->disconnectDriver(events[i].data.fd); } #endif if (events[i].events & EPOLLIN) { std::cout << "debug EPOLLIN on " << events[i].data.fd << std::endl; accept_request(events[i].data.fd); } if (events[i].events & EPOLLERR) { std::cout << "debug EPOLLERR on " << events[i].data.fd << std::endl; listener->disconnectDriver(events[i].data.fd); } } }

当我收到input连接,我试图读取所有的buff数据:

void get_all_buf(int sock,std::string & instr) { int n = 1; int @R_140_10586@l = 0; char c; char temp[1024*1024]; bzero(temp,sizeof(temp)); do { #ifdef CORE_NONBLOCKING_SOCKETS timespec time_to_wait; time_to_wait.tv_nsec = 10000000; time_to_wait.tv_sec = 0; timespec tm; time_t begin = time(null); do { #endif n = recv(sock,&temp[@R_140_10586@l],sizeof(temp),0); #ifdef CORE_NONBLOCKING_SOCKETS nanosleep(&time_to_wait,&tm); time_t end = time(null); if ((end - begin) > MAX_CLIENT_TIME) { instr = std::string(); return; } } while (n < 0 && errno == EAGAIN); //nonblocking sockets in edge-triggered mode #endif if (n > 0) { @R_140_10586@l += n; } else if (n == 0) { //TODO: error handling //debug std::cout << "possibly no one byte was received" << std::endl; break; } else if (n < 0) { //TODO: error handling //debug std::cout << "error while receiving data" << std::endl; if (errno == EBADF) { std::cout << "recv returns with EBADF: " << strerror(errno) << std::endl; } else if (errno == EFAULT) { std::cout << "recv returns with EFAULT: " << strerror(errno) << std::endl; } else if (errno == EINTR) { std::cout << "recv returns with EINTR: " << strerror(errno) << std::endl; } else if (errno == EINVAL) { std::cout << "recv returns with EINVAL: " << strerror(errno) << std::endl; } //end debug break; } } while (!strstr(temp,"</packet>")); instr = temp; };

在accept_request函数中。 但有时我得到以下在我的debugging输出

packet type='connect' size of vector<Driver> in getDriversWithMoney is 1 epoll_wait detected activity of 164 counter i = 0 nfds = 1 EPOLLRDHUP on 164 disconnectDriver (fd = 164) driver 1 disconnected debug EPOLLIN on 164 error while receiving data recv returns with EBADF: Invalid file descriptor

这意味着有人首先连接,而不是断开连接,当他试图再次连接recv返回EBADF 。 我做错了什么? 请帮帮我。

Nginx是否@R_342_10058@的请求排队机制?

在Linux机器上对Netty 4.1进行性能调优

如何在使用epoll_wait时正确读取数据

epoll是否保留了fd的注册顺序?

是否有可能检测到内核生成epoll和Sun JVM读取它之间的时间差?

PS上EPOLLRDHUP我只是closures文件描述符。 epoll man说没关系,因为epoll自己从epoll_wait队列中移除了closures的fd。

ISR中的事件通知

为什么SELEct.SELEct()使用磁盘文件但不使用epoll()?

一个Nginx工作进程是否同时或一个地处理两个请求?

一次性*级别* – 触发epoll():EPOLLOnesHOT是否意味着EPOLLET?

你可以推荐一些关于Linux上的Epoll的指南

当远程主机关闭套接字时, epoll()报告EPOLLIN的HUP和EPOLLIN 。

首先检查EPOLLRDHUP ,然后关闭套接字; 那么你检查EPOLLIN ,也找到,并尝试调用recv() 。 由于套接字已关闭文件描述符不再有效,并且您得到EBADF (将关闭套接字从epoll集中移除,所以后续的 epoll_wait()调用将不会返回它;但是对于具有epoll_wait()已经回来了太晚了 – EPOLLIN已经在你的events[i]等待了events[i] 。

调用disconnectDriver() (如果关闭文件描述符)之后,您需要停止检查事件:

if (events[i].events & EPOLLRDHUp) { std::cout << "EPOLLRDHUP on " << events[i].data.fd << std::endl; listener->disconnectDriver(events[i].data.fd); conTinue; }

大佬总结

以上是大佬教程为你收集整理的EBMPF在epoll_wait之后recv全部内容,希望文章能够帮你解决EBMPF在epoll_wait之后recv所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: