加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

关于linux中epoll 和多线程结合方面代码出问题了,求解惑。

发布时间:2022-12-09 11:27:55 所属栏目:Linux 来源:
导读:  我想做一个可以接受多客户端传输数据并进行相应处理的服务器,写完后单客户端没问题,一直发一直打印但打开第二个客户端,两个客户端发送都没问题,服务器在接受并打印第二个客户端一次数据后就卡住了,两个都不
  我想做一个可以接受多客户端传输数据并进行相应处理的服务器,写完后单客户端没问题,一直发一直打印但打开第二个客户端,两个客户端发送都没问题,服务器在接受并打印第二个客户端一次数据后就卡住了,两个都不打印。
 
  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传参的,求解惑啊!
 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!