summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/base/tcp_client_socket_win.cc9
1 files changed, 8 insertions, 1 deletions
diff --git a/net/base/tcp_client_socket_win.cc b/net/base/tcp_client_socket_win.cc
index bb25e34..11a6de3 100644
--- a/net/base/tcp_client_socket_win.cc
+++ b/net/base/tcp_client_socket_win.cc
@@ -79,6 +79,7 @@ int TCPClientSocket::Connect(CompletionCallback* callback) {
if (rv != OK)
return rv;
+ // WSACreateEvent creates a manual-reset event object.
overlapped_.hEvent = WSACreateEvent();
// WSAEventSelect sets the socket to non-blocking mode as a side effect.
// Our connect() and recv() calls require that the socket be non-blocking.
@@ -116,13 +117,19 @@ void TCPClientSocket::Disconnect() {
// Make sure the message loop is not watching this object anymore.
watcher_.StopWatching();
+ // Cancel any pending IO and wait for it to be aborted.
+ if (wait_state_ == WAITING_READ || wait_state_ == WAITING_WRITE) {
+ CancelIo(reinterpret_cast<HANDLE>(socket_));
+ WaitForSingleObject(overlapped_.hEvent, INFINITE);
+ wait_state_ = NOT_WAITING;
+ }
+
// In most socket implementations, closing a socket results in a graceful
// connection shutdown, but in Winsock we have to call shutdown explicitly.
// See the MSDN page "Graceful Shutdown, Linger Options, and Socket Closure"
// at http://msdn.microsoft.com/en-us/library/ms738547.aspx
shutdown(socket_, SD_SEND);
- // This cancels any pending IO.
closesocket(socket_);
socket_ = INVALID_SOCKET;