首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

socket客户端意外断开时,服务端死掉,提示:断开的管道,代码在里面解决方案

2012-02-26 
socket客户端意外断开时,服务端死掉,提示:断开的管道,代码在里面错误原因:当客户端断开时,client_fd不存在

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。

热点排行