diff options
author | wtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-19 23:27:33 +0000 |
---|---|---|
committer | wtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-19 23:27:33 +0000 |
commit | b2197853ee021e8b6d1c4f3c46e475da372b6980 (patch) | |
tree | 3429dcfc22d7f3ec683bbe2c1923b208d78adb26 /net/base/tcp_client_socket_win.cc | |
parent | 814c99861aa1116c588a63b20dd1b7a4f9a974e0 (diff) | |
download | chromium_src-b2197853ee021e8b6d1c4f3c46e475da372b6980.zip chromium_src-b2197853ee021e8b6d1c4f3c46e475da372b6980.tar.gz chromium_src-b2197853ee021e8b6d1c4f3c46e475da372b6980.tar.bz2 |
If an idle socket has received data unexpectedly, we can't
reuse it.
Add the IsConnectedAndIdle method, which returns true if the
connection is still alive and idle (hasn't received any data
unexpectedly).
R=eroman
BUG=4606
Review URL: http://codereview.chromium.org/21501
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10060 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/tcp_client_socket_win.cc')
-rw-r--r-- | net/base/tcp_client_socket_win.cc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/net/base/tcp_client_socket_win.cc b/net/base/tcp_client_socket_win.cc index d2a1452..18afe03c 100644 --- a/net/base/tcp_client_socket_win.cc +++ b/net/base/tcp_client_socket_win.cc @@ -157,6 +157,22 @@ bool TCPClientSocket::IsConnected() const { return true; } +bool TCPClientSocket::IsConnectedAndIdle() const { + if (socket_ == INVALID_SOCKET || wait_state_ == WAITING_CONNECT) + return false; + + // Check if connection is alive and we haven't received any data + // unexpectedly. + char c; + int rv = recv(socket_, &c, 1, MSG_PEEK); + if (rv >= 0) + return false; + if (WSAGetLastError() != WSAEWOULDBLOCK) + return false; + + return true; +} + int TCPClientSocket::Read(char* buf, int buf_len, CompletionCallback* callback) { |