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

Unix C Socket长连接的有关问题

2012-02-24 
Unix C Socket长连接的问题以下是我server程序intmain(intargc,char**argv){while(1){printf( restart\n

Unix C Socket长连接的问题
以下是我server程序
int   main(int   argc,   char   **argv)
{
  while(1)
  {
    printf( "restart\n ");
    int   serverSocket,clientConnection;
    struct   sockaddr_in   serverAddr,clientAddr;
    int   iRet,iClinetAddrLen;
    if((serverSocket   =   socket(AF_INET,SOCK_STREAM,0))   ==   -1)
    {
        printf( "Create   Socket   Error!\n ");
        continue;
    }
    serverAddr.sin_family   =   AF_INET;
    serverAddr.sin_addr.s_addr   =   htonl(INADDR_ANY);
    serverAddr.sin_port   =   htons(PORT);
    if(bind(serverSocket,(struct   sockaddr   *)&serverAddr,sizeof(serverAddr))   ==   -1)
    {
        printf( "Bind   Error!\n ");
        continue;
    }
    if(listen(serverSocket,MAXCON)   !=   0)
    {
        printf( "Listen   Error!\n ");
        close(serverSocket);
        continue;
    }
    iClinetAddrLen   =   sizeof(clientAddr);
    clientConnection   =   accept(serverSocket,(struct   sockaddr   *)&clientAddr,&iClinetAddrLen)   ;
    struct   timeval   timeout   =   {100,0};
    while(1)
    {
        if   (clientConnection   <   0   )
        {
            printf( "Connect   Failed.Please   try   again!\n ");
            break;
          }
          fd_set   r;
          FD_ZERO(&r);
          FD_SET(clientConnection,   &r);
          int   iRet   =   select(clientConnection+1,&r,NULL,NULL,&timeout);
          if(iRet   <=   0)
          {
              break;
          }
          else  
          {
              if   (FD_ISSET(clientConnection,&r))  
              {
                  char   recvBuf[2048];
                  char   sendBuf[2048];
                  int   len;
                  memset(recvBuf,0,sizeof(recvBuf));
                  memset(sendBuf, '   ',sizeof(sendBuf));
                  len   =   recv(clientConnection,recvBuf,sizeof(recvBuf),0);
                  if(len   >   0)
                  {


                    //处理数据
                  }
              }
          }
      }
    }
    close(serverSocket   );
}
当客户端断开后,无法重新连接上服务器.我知道是因为accept的client是原来的client,端口后无法获得这个client且没有释放,所以一直无法获得他发的包,所以进入了死循环,请问如何改进这个程序呢?谢谢

[解决办法]
if (FD_ISSET(clientConnection,&r))
{
char recvBuf[2048];
char sendBuf[2048];
int len;
memset(recvBuf,0,sizeof(recvBuf));
memset(sendBuf, ' ',sizeof(sendBuf));
len = read(clientConnection,recvBuf,sizeof(recvBuf),0);//这里返回-1 的时候关闭socket
if(len > 0)
{
//处理数据
}
}

热点排行