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 @@ -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& 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();