2014-04-27 15 views
0

我使用下面的代码客户端套接字取消连接阻塞插座?

int ConnectToServerSocket 
    (
     char* _serverIP,   //in 
     char* _serverPort,  //in 
     SOCKET& _connectedSocket //out 
    ) 
{ 
    struct addrinfo *addrResult = NULL,hints; 
    ZeroMemory(&hints, sizeof (hints)); 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 
    hints.ai_family = AF_UNSPEC; 
    int result = 0; 
    if (getaddrinfo(_serverIP, _serverPort, &hints, &addrResult)) 
    { 
     int err = WSAGetLastError(); 
     return err; 
    } 

    _connectedSocket = socket(addrResult->ai_family, addrResult->ai_socktype, addrResult->ai_protocol); 
    if (_connectedSocket == INVALID_SOCKET) 
    { 
     int err = WSAGetLastError(); 
     freeaddrinfo(addrResult); 
     return err; 
    } 

    if (connect(_connectedSocket, addrResult->ai_addr, (int)addrResult->ai_addrlen) != 0) 
    { 
     int err = WSAGetLastError(); 
     closesocket(_connectedSocket); 
     _connectedSocket = INVALID_SOCKET; 
     return err; 
    } 
    return 0; //successful 
} 

的问题是我要随时取消连接,在取消事件按钮,我叫closesocket(_connectedSocket);但它返回后阻断connect()功能这么久错误。

有人可以告诉我如何立即中断connect()函数吗?

非常感谢,

牛逼&牛逼

+1

使用'fcntl'将套接字设置为'O_NONBLOCK'。 – alvits

+0

@alvits:谢谢!但是,如果我使用非阻塞套接字,可以告诉我如何正确更改上述代码? – TTGroup

+1

客户端确实在connect()上阻塞,除非套接字处于非阻塞模式。 – EJP

回答

1

有另一个线程做connect。这将允许您使用任何方法等待其他线程,无论长时间,以及您希望的任何中止机制。

您不需要中止connect本身。

+0

谢谢,也许你的方式对我的问题最简单:) – TTGroup