读书人

socket客户端意外断开时,服务端死掉,提

发布时间: 2012-02-26 20:19:44 作者: rapoo

socket客户端意外断开时,服务端死掉,提示:断开的管道,代码在里面
错误原因:当客户端断开时,client_fd不存在了,造成:子线程错误,所以服务端死掉,但我不知道怎么解决,请各位给个意见
//
void * Socket_childthread(void *arg)
{
//CALLFUN Update = (CALLFUN)fun;
int * aaa=(int *)arg;
int bbb;
bbb=*aaa;
Cchildsocket *childsocket=new Cchildsocket(bbb);
listsocks.addsock(childsocket);
}
//生成socket的代码(说明:我要求每个请求都生成一个socket)
void Clisten::lis()
{
while(1)
{
int client_fd;
socklen_t sin_size = sizeof(struct sockaddr_in);
if ( (client_fd = accept(sockfd, (struct sockaddr *)&remote_addr,&sin_size )) == -1)
{
//perror( "accept error! ");
//continue;
}
//*/
if(client_fd> -1)
{
printf( "receive a connection from%sclient_fd%d\n ",inet_ntoa(remote_addr.sin_addr),client_fd);

if(!fork())
{
if(send(client_fd, "you are connected!\n ",26,0)==-1)
{
perror( "send error! ");
//close(client_fd);
//exit(1);
}
}
pthread_t chilepthread;
//memcpy
pthread_create(&chilepthread,NULL,Socket_childthread,(void *)&client_fd);//socket子线程
}
//*/
}


}

[解决办法]
SIGPIPE的信号缺省会中止进程,所以需要用sigaction忽略SIGPIPE。

读书人网 >C++

热点推荐