linux下 socket多线程 socket泄露问题 10
大神们好。。。小弟最近做一个项目需要用到一对多的服务端socket开发。。。用于随时随地接受客户端发送过来的信息。。。用的socket协议。。。我选择了在linux上开发...
大神们好。。。小弟最近做一个 项目 需要用到一对多 的服务端 socket开发。。。用于随时随地接受客户端发送过来的信息。。。用的socket协议。。。我选择了在linux上开发。。然后设计思路是多线程的 在进程的主线程里使用accept接受socket连接请求,然后为每个socket请求 创建一个线程,并发的为每一个客户端处理数据。。。但是发现客户端处理线程再跟客户端建立了socket连接之后虽然可以正常通信,但是经过一段较长时间后,客户端主动断开socket,服务端(read函数)没反应,这样就造成了,线程泄露,socket泄露,因为我的设定是,先判断客户端是否主动关闭了socket,才决定是否关闭线程。。。(但是如果经过的时间较短的话,客户端主动断开,服务端(read函数)可以正常返回。
我觉得虽然怀疑是read函数的问题 但是无法确定是什么原因 希望有大神帮我看看。。。以下附处理线程的代码:
void *thread_server(void *arg)
{
int Readres,Writeres;
bool IsConnection = true;
int sockfd;
sockfd = client_sockfd[(int)arg];
char buf[BUFNUM];
printf("enter subthread: %d -- %d\n",(int)arg,sockfd);
while(IsConnection)
{
memset(buf, '\0', sizeof(buf));
/*读取客户端发送的数据*/
Readres = read(sockfd, buf, sizeof(buf));
if(Readres == 0)
{
printf("read() return 0 ! this thread will exit! --from %d -- %d\n",(int)arg,sockfd);
IsConnection = false;
}
else if(Readres < 0)
{
printf("read() return ERROR:%d ==> %s! this thread will exit!\n",strerror(errno));
IsConnection = false;
}
else
{
printf("The Client say %d char: %s --from %d--%d\n",Readres,buf,(int)arg,sockfd);
/*处理客户端的数据*/
DataProcess(buf);
/*向客户端发送数据*/
//Writeres = write(sockfd, &(buf[BUFNUM]), sizeof(buf[BUFNUM]));
IsConnection = true;
}
}
close(sockfd);
pthread_exit(NULL);
} 展开
我觉得虽然怀疑是read函数的问题 但是无法确定是什么原因 希望有大神帮我看看。。。以下附处理线程的代码:
void *thread_server(void *arg)
{
int Readres,Writeres;
bool IsConnection = true;
int sockfd;
sockfd = client_sockfd[(int)arg];
char buf[BUFNUM];
printf("enter subthread: %d -- %d\n",(int)arg,sockfd);
while(IsConnection)
{
memset(buf, '\0', sizeof(buf));
/*读取客户端发送的数据*/
Readres = read(sockfd, buf, sizeof(buf));
if(Readres == 0)
{
printf("read() return 0 ! this thread will exit! --from %d -- %d\n",(int)arg,sockfd);
IsConnection = false;
}
else if(Readres < 0)
{
printf("read() return ERROR:%d ==> %s! this thread will exit!\n",strerror(errno));
IsConnection = false;
}
else
{
printf("The Client say %d char: %s --from %d--%d\n",Readres,buf,(int)arg,sockfd);
/*处理客户端的数据*/
DataProcess(buf);
/*向客户端发送数据*/
//Writeres = write(sockfd, &(buf[BUFNUM]), sizeof(buf[BUFNUM]));
IsConnection = true;
}
}
close(sockfd);
pthread_exit(NULL);
} 展开
1个回答
2016-08-11
展开全部
把接收输入的read函数改成recv试试。socket通信最好用recv。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询