使用epoll出现问题,偶然性,有时候有问题,有时候又是正常的。

问题描述

使用epoll出现问题,偶然性,有时候有问题,有时候又是正常的。

我用一个线程监听,如果有数据可读,就通知另一个线程去读。下面是监听线程的代码。出现的问题就是三次握手后,服务端就自动发送了一个FIN报文,接着客户端发送数据就会收到RST

void ListenThread::run()
{
int max_epoll=pconf->value("max_connect","1024").toInt();
short listen_port=pconf->value("listen_port","9000").toShort();
int res;

struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(listen_port);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

int listen_socket=socket(AF_INET,SOCK_STREAM,0);

// int opts=fcntl(listen_socket,F_GETFL);
// fcntl(listen_socket,F_SETFL,opts|O_NONBLOCK);

res=::bind(listen_socket,(sockaddr *)&server_addr,sizeof(server_addr));
if(res!=0){
    emit listen_error();
    return;
}

res=::listen(listen_socket,max_epoll);
if(res!=0){
    emit listen_error();
    return;
}
emit listen_success();

struct epoll_event ev,events[64];
int epfd=epoll_create(max_epoll);
EpollEventData *eed=new EpollEventData;
eed->fd=listen_socket;
ev.data.ptr=eed;
ev.events=EPOLLIN;
epoll_ctl(epfd,EPOLL_CTL_ADD,listen_socket,&ev);

while(isRun){
    //qDebug()<<"listen......";
    int res=epoll_wait(epfd,events,64,100);
    if(res<0){
        emit listen_error();
    }
    for(int i=0;i<res;i++){
        if(((EpollEventData *)events[i].data.ptr)->fd==listen_socket){//有新的连接请求
            //qDebug()<<"new connection in";
            sockaddr_in con_addr;
            socklen_t addr_len;
            int con_socket=::accept(listen_socket,(sockaddr *)&con_addr,&addr_len);

            int opts=fcntl(con_socket,F_GETFL);
            fcntl(con_socket,F_SETFL,opts|O_NONBLOCK);
            EpollEventData * eed_con=new EpollEventData;
            struct epoll_event ev_con;
            eed_con->fd=con_socket;
            inet_ntop(AF_INET,&con_addr.sin_addr,eed_con->ip,INET_ADDRSTRLEN);
            ev_con.data.ptr=eed_con;
            ev_con.events=EPOLLIN|EPOLLONESHOT|EPOLLET;
            epoll_ctl(epfd,EPOLL_CTL_ADD,con_socket,&ev_con);
            //qDebug()<<"new connection add";
        }
        else if(events[i].events & EPOLLIN){//有socket数据可读
            //qDebug()<<"can read";
            EpollEventData *ed=(EpollEventData *)events[i].data.ptr;
            pthread_mutex_lock(&mutex_socket);
            pSocketList->push_back(ed);
            pthread_cond_signal(&cond_socket);
            pthread_mutex_unlock(&mutex_socket);
            //epoll_ctl(epfd,EPOLL_CTL_DEL,ed->fd,&events[i]);
        }
        else{//差错处理

        }
    }
}
delete eed;
::close(listen_socket);
::close(epfd);

}

解决方案

望哪位大神帮我看看。刚接触epoll,用的不对的地方还请指教。谢谢了。已经纠结了几天了

解决方案二:

求大神来看看,新手没有悬赏,只能谢谢了

时间: 2024-12-03 18:29:44

使用epoll出现问题,偶然性,有时候有问题,有时候又是正常的。的相关文章

图片-WebView显示不全,有时候正常,有时候不正常

问题描述 WebView显示不全,有时候正常,有时候不正常 WEbView加载数据的时候,有时候显示正常,有时候显示不正常,如图,请大神帮忙解决下,代码如下:mNewsDocWeb = (WebView) findViewById(R.id.wb_news_doc_info); mNewsDocWeb.getSettings().setJavaScriptEnabled(true); mNewsDocWeb.getSettings().setLayoutAlgorithm( LayoutAlgo

android 位置消息有时候能发有时候不能发 。

问题描述 android 位置消息有时候能发有时候不能发 ,而且位置消息发不出去之后别的什么文本消息啥的也都发不出去 解决方案 @zhuhy 返回的错误message.getError()=0:可是0不是NO_ERROR吗解决方案二: 解决方案三:@hblzg123 求解答解决方案四:@fat1解决方案五: 解决方案六:@zhangnan解决方案七:在初始化加上第三方判断试试http://docs.easemob.com/doku.p ... cs%23初始化sdk

添加好友-有时候有提示有时候无提示

问题描述 点击添加好友,有时候对方会收到提示.有时候收不到.不知道怎么处理?而且A+B为好友,B收到好友请求后同意,A好友中有B,B中没有A 解决方案 看下好友列表(联系人列表)与服务器上的数据同步的监听做了吗?

发送语音有时候没有问题 但是有时候会崩溃

问题描述 解决方案 之前还有其他的崩溃,不是这个崩溃 这个问题我看了是因为当index=20的时候  此时数组图片实际上19张 没看明白 我在if里面判断>=改成这样  目前不蹦在这里了

java-eclipse使用的时候我在控制台输入文本,有时候正常有时候出错,老师说是光标问题,但真心不懂啊

问题描述 eclipse使用的时候我在控制台输入文本,有时候正常有时候出错,老师说是光标问题,但真心不懂啊 有时候输入是正常的,而且为了避免文本本身的问题,我用固定的文本来测试,但奇怪的是 有时候正常,有时候就报各种错误,输入的时候文本并没有变绿,而是很正常的输入的那种 但结果总是正常不正常的,问了下人,说是在汉字输入的时候和英文不时光标定位的事,但没听懂 请问大神们是怎么解决的呢 解决方案 因为每个汉字编码是两个字节,而标准输入System.in是字节流,这样就会造成程序中对字符接收的不完全,

网页表单自动填写技术(gmail为例)

网页 以下是引用片段: var ie=WScript.createobject("InternetExplorer.Application"); var args = WScript.arguments; var followme=http://www.google.com/; if(args.length>0) { followme+=args(0); } ie.Navigate("https://www.google.com/accounts/Login?conti

浅析:新站上线我的优化思路

众所周知,新站上线其优化手法和思路往往和老站有着巨大的差别,主要在于新站本身根本没权重,上线之后第一道关就是要经过百度的考核,在百度考察的过程中,我们网站没排名,甚至很长时间收录都不会变化,这个时候也是最容易浮躁和出问题的时候,笔者自己的西安橱柜网上线一周左右,正常工作日每天更新,目前的状况是收录2篇,现在笔者分享下后一阶段我对于这个站的优化思路,大家先看看图示.   第一,网站关键词的布局分析.新站上线之后关键词的布局和分析是基础,企业网站导航一般是公司简介.产品展示之类的,布置关键词一般三大

Oracle错误案例:ORA-00922

ORA-00922 missing or invalid option  0RA-00922: 丢失或者无效的选项 Cause An invalid option was specified in defining a column or storage clause. The valid option in specifying a column is NOT NULL to specify that the column cannot contain any NULL values. Onl

15天打造2000IP

大家好,这篇是我在admin5上的第三篇文章,在这里我学会了很多,知道了很多,看到了中国很多站长的喜怒哀乐,说句心里话,我的确学会 了很多,张了很多见识,"林子大了,可以什么鸟都有了".这里首先感谢图王提供着么好的平台,祝各位站长网站越做越好,芝麻开花节节 高! 现在已经12点了,但是总是睡不着,家里的电脑不能上网,不过心里总是想着自己的网站,虽然算不上什么好站,但是在我眼力算的上做的很 好的了,这个站是个电影下载站,我用了16天的时间,把每天IP做到1500,最高的时候有2500,虽

C#技巧:网页表单自动填写技术(gmail为例)

技巧|网页 var ie=WScript.createobject("InternetExplorer.Application");var args = WScript.arguments;var followme="http://www.google.com/";if(args.length>0){    followme+=args(0);}ie.Navigate("https://www.google.com/accounts/Login?co