2012-12-24 150 views
0

我想通過非阻塞連接()連接到另一臺機器上的服務器。WSAEWOULDBLOCK無阻塞連接錯誤()

但是,當我這樣做時,Connect()返回-1,並且我從WSAGetLastError()接收WSAEWOULDBLOCK。

MSDN文檔指出:這是正常的WSAEWOULDBLOCK從調用connect在非阻塞SOCK_STREAM套接字報告的結果,因爲必須花費一些時間要建立的連接(reference)。

問題是我總是收到錯誤,並且從connect()返回-1即使如果我的服務器沒有運行。

正如所建議的,我的套接字是一個SOCK_STREAM套接字。我該如何補救?我應該在connect()調用之後提供一個超時來確保連接建立連接的時間足夠長嗎?

+0

如果您嘗試連接到不存在的服務器,它可能確實會阻塞很長一段時間。即使連接到不存在的服務器或未打開的服務器端口,總會有一些網絡通信正在進行。請參閱[TCP 3-way握手](http://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml)以瞭解連接建立過程中會發生什麼。 –

+0

您可以使用select()來阻止連接完成。 –

回答

2

使用ConnectEx並通過OVERLAPPED結構。這樣,當連接嘗試完成時,您可以稍後檢索實際狀態。

+0

你也可以使用'connect()'。您可以使用'WSAAsyncSelect()'來檢測連接何時完成,成功或失敗以及失敗時的錯誤代碼。 –

+0

@Remy:或者WSAEventSelect和WSAEnumNetworkEvents。這些其他選項都不像使用'OVERLAPPED'結構那樣乾淨和一致。 –