用SOCKET编程时,怎样设定SOCKET超过20秒没有连接上就发一个通知?

解决方案 »

  1.   

    FD_SET readfds;
    readfds.fd_count=1;
    readfds.fd_array[0]=Service_Socket;
    timeval theval;
    theval.tv_sec=60;//20
    theval.tv_usec=0;
    if (select(0, &readfds,NULL,NULL,&theval)<=0)
    {
    //发送通知包
    }
      

  2.   

    另开一个线程
    DWORDThread1(...)
    {
        if ( WaitForSingleObject(hEvent,20000) == TIME_OUT )
             ...........
    }
      

  3.   

    if (WSAStartup(MAKEWORD(2,2),&wsd))
      {
        printf("WSAStartup run failed,errno=%d!\n",GetLastError());
        return 1;
      }
      if ((sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
      {
        printf("socket run failed,errno=%d!\n",WSAGetLastError());
        WSACleanup();
        return 1;   
      }
      memset(&local,0,sizeof(struct sockaddr_in));
      local.sin_family=AF_INET;
      local.sin_port=htons(8889);
      local.sin_addr.s_addr=inet_addr("127.0.0.1");
      if (bind(sClient,(struct sockaddr *)&local,sizeof(local))==SOCKET_ERROR)
      {
        printf("bind run failed,errno=%d!\n",WSAGetLastError());
        closesocket(sClient);
        WSACleanup();
        return 1;
      }
      memset(&server,0,sizeof(struct sockaddr_in));
      server.sin_family=AF_INET;
      server.sin_port=htons(iPort);
      if ((server.sin_addr.s_addr=inet_addr(SIPInfo))==INADDR_NONE)
      {
        if ((host=gethostbyname(SIPInfo))==NULL)
        {
          printf("gethostbyname run failed,errno=%d!\n",WSAGetLastError());
      closesocket(sClient);
          WSACleanup();
          return 1;
        }
        memcpy(&(server.sin_addr),host->h_addr_list[0],host->h_length);
        if (server.sin_addr.s_addr==INADDR_NONE)
    {
      printf("invalid server ip address,errno=%d!\n",WSAGetLastError());
      closesocket(sClient);
          WSACleanup();
          return 1;
        }
      }
      if (ioctlsocket(sClient,FIONBIO,&NonBlock)==SOCKET_ERROR)//将client socket设为非阻塞
      {
        printf("ioctlsocket run failed,errno=%d!\n",WSAGetLastError());
        closesocket(sClient);
        WSACleanup();
        return 1; 
      }
      FD_ZERO(&WriteSet);
      FD_SET(sClient,&WriteSet);
      FD_ZERO(&ExceptSet);
      FD_SET(sClient,&ExceptSet);
      tout.tv_sec=20;
      tout.tv_usec=0;
      connect(sClient,(const struct sockaddr *)&server,sizeof(server));
      if (select(0,NULL,&WriteSet,&ExceptSet,&tout)<1)
      {
        printf("select run failed,errno=%d!\n",WSAGetLastError());//errno为0则超时,否则select运行失败
        closesocket(sClient);
        WSACleanup();
        return 1; 
      }
      if (FD_ISSET(sClient,&ExceptSet))
      { 
        printf("connect failed,errno=%d!\n",WSAGetLastError());
        closesocket(sClient);
        WSACleanup();
        return 1; 
      }
      if (FD_ISSET(sClient,&WriteSet))
        printf("connect successfully,server ip address is:%s,port is:%d.\n",inet_ntoa(server.sin_addr),ntohs(server.sin_port));
      

  4.   

    socket //创建socket
    setsockopt//设置异步
    connect//
    while (time < 20s) if (select返回) return; else sleep
      

  5.   

    用异步的,开一个timer计时,另设一个变量作为超市的通知变量