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

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

发布时间:2022-10-24 14:02:45 所属栏目: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传参的,求解惑啊!

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

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