summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-02-03 19:09:06 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-02-03 19:09:06 +0900
commit98e7018599c010b56ade294942e2e7b3d58d1bb6 (patch)
tree21278fcd6703169e43d62d25f86d3d5cd8958de7 /src
parent1c9cfccac4bdd16b8c6662eab9e58d6f517424d0 (diff)
Fix failure to set TCP_NODELAY on Windows
On Windows setting TCP_NODELAY after non-blocking connect fails at least on Windows 7.
Diffstat (limited to 'src')
-rw-r--r--src/FtpInitiateConnectionCommand.cc2
-rw-r--r--src/FtpNegotiationCommand.cc6
-rw-r--r--src/HttpInitiateConnectionCommand.cc2
-rw-r--r--src/PeerInitiateConnectionCommand.cc2
-rw-r--r--src/SocketCore.cc6
-rw-r--r--src/SocketCore.h4
6 files changed, 10 insertions, 12 deletions
diff --git a/src/FtpInitiateConnectionCommand.cc b/src/FtpInitiateConnectionCommand.cc
index 5558e712..374bfccb 100644
--- a/src/FtpInitiateConnectionCommand.cc
+++ b/src/FtpInitiateConnectionCommand.cc
@@ -95,7 +95,6 @@ Command* FtpInitiateConnectionCommand::createNextCommand
getCuid(), addr.c_str(), port));
createSocket();
getSocket()->establishConnection(addr, port);
- getSocket()->setTcpNodelay(true);
getRequest()->setConnectedAddrInfo(hostname, addr, port);
if(proxyMethod == V_GET) {
@@ -164,7 +163,6 @@ Command* FtpInitiateConnectionCommand::createNextCommand
getCuid(), addr.c_str(), port));
createSocket();
getSocket()->establishConnection(addr, port);
- getSocket()->setTcpNodelay(true);
FtpNegotiationCommand* c =
new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(),
getRequestGroup(), getDownloadEngine(),
diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc
index a5c804b9..03827b54 100644
--- a/src/FtpNegotiationCommand.cc
+++ b/src/FtpNegotiationCommand.cc
@@ -682,8 +682,7 @@ bool FtpNegotiationCommand::preparePasvConnect() {
dataAddr.first.c_str(),
pasvPort_));
dataSocket_.reset(new SocketCore());
- dataSocket_->establishConnection(dataAddr.first, pasvPort_);
- dataSocket_->setTcpNodelay(true);
+ dataSocket_->establishConnection(dataAddr.first, pasvPort_, false);
disableReadCheckSocket();
setWriteCheckSocket(dataSocket_);
sequence_ = SEQ_SEND_REST_PASV;
@@ -705,7 +704,6 @@ bool FtpNegotiationCommand::resolveProxy()
proxyAddr_.c_str(), proxyReq->getPort()));
dataSocket_.reset(new SocketCore());
dataSocket_->establishConnection(proxyAddr_, proxyReq->getPort());
- dataSocket_->setTcpNodelay(true);
disableReadCheckSocket();
setWriteCheckSocket(dataSocket_);
SharedHandle<SocketRecvBuffer> socketRecvBuffer
@@ -741,7 +739,6 @@ bool FtpNegotiationCommand::sendTunnelRequest()
getCuid(),
proxyAddr_.c_str(), proxyReq->getPort()));
dataSocket_->establishConnection(proxyAddr_, proxyReq->getPort());
- dataSocket_->setTcpNodelay(true);
return false;
}
}
@@ -870,7 +867,6 @@ bool FtpNegotiationCommand::waitConnection()
disableReadCheckSocket();
setReadCheckSocket(getSocket());
dataSocket_ = serverSocket_->acceptConnection();
- dataSocket_->setTcpNodelay(true);
sequence_ = SEQ_NEGOTIATION_COMPLETED;
return false;
}
diff --git a/src/HttpInitiateConnectionCommand.cc b/src/HttpInitiateConnectionCommand.cc
index 3012467f..794b1886 100644
--- a/src/HttpInitiateConnectionCommand.cc
+++ b/src/HttpInitiateConnectionCommand.cc
@@ -82,7 +82,6 @@ Command* HttpInitiateConnectionCommand::createNextCommand
getCuid(), addr.c_str(), port));
createSocket();
getSocket()->establishConnection(addr, port);
- getSocket()->setTcpNodelay(true);
getRequest()->setConnectedAddrInfo(hostname, addr, port);
if(proxyMethod == V_TUNNEL) {
@@ -140,7 +139,6 @@ Command* HttpInitiateConnectionCommand::createNextCommand
getCuid(), addr.c_str(), port));
createSocket();
getSocket()->establishConnection(addr, port);
- getSocket()->setTcpNodelay(true);
getRequest()->setConnectedAddrInfo(hostname, addr, port);
} else {
diff --git a/src/PeerInitiateConnectionCommand.cc b/src/PeerInitiateConnectionCommand.cc
index cc878c27..5803805b 100644
--- a/src/PeerInitiateConnectionCommand.cc
+++ b/src/PeerInitiateConnectionCommand.cc
@@ -82,7 +82,7 @@ bool PeerInitiateConnectionCommand::executeInternal() {
getPeer()->getPort()));
createSocket();
getSocket()->establishConnection(getPeer()->getIPAddress(),
- getPeer()->getPort());
+ getPeer()->getPort(), false);
if(mseHandshakeEnabled_) {
InitiatorMSEHandshakeCommand* c =
new InitiatorMSEHandshakeCommand(getCuid(), requestGroup_, getPeer(),
diff --git a/src/SocketCore.cc b/src/SocketCore.cc
index 55c97d08..619002be 100644
--- a/src/SocketCore.cc
+++ b/src/SocketCore.cc
@@ -409,7 +409,8 @@ int SocketCore::getPeerInfo(std::pair<std::string, uint16_t>& peerinfo) const
return sockaddr.storage.ss_family;
}
-void SocketCore::establishConnection(const std::string& host, uint16_t port)
+void SocketCore::establishConnection(const std::string& host, uint16_t port,
+ bool tcpNodelay)
{
closeConnection();
std::string error;
@@ -461,6 +462,9 @@ void SocketCore::establishConnection(const std::string& host, uint16_t port)
sockfd_ = fd;
// make socket non-blocking mode
setNonBlockingMode();
+ if(tcpNodelay) {
+ setTcpNodelay(true);
+ }
if(connect(fd, rp->ai_addr, rp->ai_addrlen) == -1 &&
SOCKET_ERRNO != A2_EINPROGRESS) {
errNum = SOCKET_ERRNO;
diff --git a/src/SocketCore.h b/src/SocketCore.h
index 4b04c3fb..f673657e 100644
--- a/src/SocketCore.h
+++ b/src/SocketCore.h
@@ -207,8 +207,10 @@ public:
* the connection is established.
* @param host hostname or ip address to connect to
* @param port service port number to connect to
+ * @param tcpNodelay true to disable Nagle algorithm
*/
- void establishConnection(const std::string& host, uint16_t port);
+ void establishConnection(const std::string& host, uint16_t port,
+ bool tcpNodelay = true);
void setNonBlockingMode();