2014-04-27 14 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