关于linux中epoll和多线程结合方面代码出问题了,求解惑。
我想做一个可以接受多客户端传输数据并进行相应处理的服务器,写完后单客户端没问题,一直发一直打印但打开第二个客户端,两个客户端发送都没问题,服务器在接受并打印第二个客户端一次数据后就卡住了,两个都不打印。 void* Thread(void *tmpbuff) 66 { 67printf("Thread =%s\n",(char *)tmpbuff); 68Parserecv((char *)tmpbuff); 69return NULL; 70 } int Createepolltab(int sockfd) 95 { 96int i = 0; 97int epfd = 0; 98int confd[100] = {0}; 99int nready = 0; 100char tmpbuff[1024] ={0}; 101ssize_t nsize = 0; 102struct epoll_event retenv[MAX_FD_LEN]; 103 104 105pthread_t tid; 106pthread_attr_t attr; 107 108pthread_attr_init(&attr); 109pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); 110 111epfd = epoll_create(MAX_FD_LEN); 112if(-1 == epfd) 113{ 114return -1; 115} 116 117AddFd(epfd,sockfd); 118while(1) 119{ 120nready = epoll_wait(epfd,retenv,MAX_FD_LEN,-1); 121if(-1 == nready) 122{ 123return -1; 124} 125for(i = 0;i126{ 127if(retenv[i].data.fd == sockfd) 128{ { 129confd[i] = accept(sockfd,NULL,NULL); 130if(-1 == confd[i]) 131{ 132DelFd(epfd,sockfd); 133close(sockfd); 134continue; 135} 136AddFd(epfd,confd[i]); 137} 138else if(retenv[i].data.fd == confd[i]) 139{ 140memset(tmpbuff,0,sizeof(tmpbuff)); 141nsize = recv(confd[i],tmpbuff,sizeof(tmpbuff),0); 142if(-1 == nsize) 143{ 144DelFd(epfd,confd[i]); 145close(confd[i]); 146continue; 147} 148else if(0 == nsize) 149{ 150DelFd(epfd,confd[i]); 151close(confd[i]); 152continue; 153} 154printf("tmpbuff=%s\n",tmpbuff); 155pthread_create(&tid,&attr,Thread,&tmpbuff); 156} 157} 158} 159pthread_attr_destroy(&attr); 160close(epfd); 161return 0; 162 } 一开始我觉得问题可能出在recv函数上,不同confd共用一个tmpbuff数组导致互相卡住了,后来malloc了100个指针的指针数组,每个指针指向一个数组,传tmbuff改成tmpbuff[i],但改完连单个客户端接受解析数据都不对了,我迷茫了,不知道该怎么搞。难道是我多个客户端共用一个线程的问题吗?我想动态生成线程,不想提前写好100个啊。线程池苏醒和沉睡目前本人还没学到,只是大概了解原理线程池linux,函数接口都没学到,想先写个简单点的。本人预期效果是epoll监听接受到一个sockfd,生成一个confd[i]加进文件描述符集合,接收到confd[i],就接受套接字发过来的数据,并创建一个线程把数据传进去,在那个线程里再调用我写好的解析函数并存到某个位置。多个客户端链接发送数据,服务器不同线程各干各的不要影响。但recv这块我不知道怎么处理了,我学的简单示例里没有关于多线程create传参的,求解惑啊! (编辑:通辽站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |