diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-13 16:32:47 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-13 16:32:47 +0000 |
| commit | 495f02ebbceaf72c125d809f6ce38004b6dd580a (patch) | |
| tree | eb0fb6ddc1121aded8c92a49359c7f231ca0b90e /src/SocketCore.cc | |
| parent | 281319e8cd3ca184dc3868c3d4740c24ab2607a4 (diff) | |
2008-09-14 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Use non-blocking socket for TCP communication to avoid possible
blocking due to buffer full.
* src/AbstractProxyRequestCommand.cc
* src/FtpConnection.cc
* src/FtpConnection.h
* src/FtpNegotiationCommand.cc
* src/FtpNegotiationCommand.h
* src/HttpConnection.cc
* src/HttpConnection.h
* src/HttpRequestCommand.cc
* src/InitiatorMSEHandshakeCommand.cc
* src/InitiatorMSEHandshakeCommand.h
* src/MSEHandshake.cc
* src/MSEHandshake.h
* src/Makefile.am
* src/PeerConnection.cc
* src/PeerConnection.h
* src/PeerInteractionCommand.cc
* src/PeerListenCommand.cc
* src/ReceiverMSEHandshakeCommand.cc
* src/ReceiverMSEHandshakeCommand.h
* src/SocketBuffer.cc
* src/SocketBuffer.h
* src/SocketCore.cc
* src/SocketCore.h
Diffstat (limited to 'src/SocketCore.cc')
| -rw-r--r-- | src/SocketCore.cc | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/SocketCore.cc b/src/SocketCore.cc index 3ee3e159..5c7802fe 100644 --- a/src/SocketCore.cc +++ b/src/SocketCore.cc @@ -440,14 +440,16 @@ bool SocketCore::isReadable(time_t timeout) } -void SocketCore::writeData(const char* data, size_t len) +ssize_t SocketCore::writeData(const char* data, size_t len) { ssize_t ret = 0; if(!secure) { while((ret = send(sockfd, data, len, 0)) == -1 && errno == EINTR); - // TODO assuming Blocking mode. - if(ret == -1 || (size_t)ret != len) { + if(ret == -1 && errno == EAGAIN) { + ret = 0; + } + if(ret == -1) { throw DlRetryEx(StringFormat(EX_SOCKET_SEND, errorMsg()).str()); } } else { @@ -455,17 +457,31 @@ void SocketCore::writeData(const char* data, size_t len) // for SSL // TODO handling len == 0 case required ret = SSL_write(ssl, data, len); - if(ret <= 0 || (size_t)ret != len) { - throw DlRetryEx(StringFormat(EX_SOCKET_SEND, ERR_error_string(ERR_get_error(), NULL)).str()); + if(ret < 0) { + switch(SSL_get_error(ssl, ret)) { + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + ret = 0; + } + } + if(ret <= 0) { + throw DlRetryEx(StringFormat(EX_SOCKET_SEND, + ERR_error_string(ERR_get_error(), 0)).str()); } #endif // HAVE_LIBSSL #ifdef HAVE_LIBGNUTLS - ret = gnutls_record_send(sslSession, data, len); - if(ret < 0 || (size_t)ret != len) { + while((ret = gnutls_record_send(sslSession, data, len)) == + GNUTLS_E_INTERRUPTED); + if(ret == GNUTLS_E_AGAIN) { + ret = 0; + } + if(ret < 0) { throw DlRetryEx(StringFormat(EX_SOCKET_SEND, gnutls_strerror(ret)).str()); } #endif // HAVE_LIBGNUTLS } + + return ret; } void SocketCore::readData(char* data, size_t& len) |
