summaryrefslogtreecommitdiff
path: root/src/SocketCore.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-13 16:32:47 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-13 16:32:47 +0000
commit495f02ebbceaf72c125d809f6ce38004b6dd580a (patch)
treeeb0fb6ddc1121aded8c92a49359c7f231ca0b90e /src/SocketCore.cc
parent281319e8cd3ca184dc3868c3d4740c24ab2607a4 (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.cc30
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)