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