各位大侠,在下的完成端口程序要控制接收和发送超时,不知道怎么玩,我现在用的是比较土的办法,开始操作前计时,然后另外线程来检查,如果时间到来就取消操作(关闭套接字),我发现这个开始计时的操作也要浪费不少时间,不知道各位有什么更好的具有创意的方法来控制这个,套接字选项不行,只用于阻塞套接字

解决方案 »

  1.   

    to yhqs540(普通话,语言中的战斗机):
      不解,请详细解释
      

  2.   

    http://search.csdn.net/Expert/topic/989/989326.xml?temp=4.793948E-02
      

  3.   

    to gracezhu:
      并不是那个异步控制发送接收超时啊
      

  4.   

    这个应该是可以用的
    LPHOSTENT ScanIPAddr(DWORD dwIP)
    {
    SOCKET sock = INVALID_SOCKET;
    LPHOSTENT lphost = NULL;
    SOCKADDR_IN server;
    u_long ul = 1;
    struct timeval timeout ;
    fd_set r; memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = _nPort;
    server.sin_addr.s_addr = htonl((u_long)dwIP); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock == INVALID_SOCKET)
    return NULL; //设置非阻塞方式连接
    if(ioctlsocket(sock, FIONBIO, (u_long*)&ul)==SOCKET_ERROR)
    return NULL; if(0 != connect(sock, (SOCKADDR*)&server, sizeof(server)))
    {
    if(WSAGetLastError() != WSAEWOULDBLOCK)
    {
    closesocket(sock);
    return NULL;
    }
    } //select 模型,即设置超时
    FD_ZERO(&r);
    FD_SET(sock, &r);
    timeout.tv_sec = 0; //连接超时0秒
    timeout.tv_usec = 700;
    if(select(0, 0, &r, 0, &timeout) <= 0)
    {
    closesocket(sock);
    return NULL;
    } lphost = gethostbyaddr((const char *)&(server.sin_addr), 4, AF_INET);
    closesocket(sock); return lphost;
    }