From 80bc9a8a21be66b3e59b2f830f16e0a9ddd7ad6e Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 19 Feb 2008 13:36:39 +0000 Subject: [PATCH] 2008-02-19 Tatsuhiro Tsujikawa Make listening socket non-block mode. * src/FtpConnection.cc * src/FtpNegotiationCommand.{h, cc} * src/PeerListenCommand.cc Fixed the bug that cause slow ftp negotiation. * src/FtpNegotiationCommand.{h, cc} --- ChangeLog | 10 ++++++++++ src/FtpConnection.cc | 3 ++- src/FtpNegotiationCommand.cc | 31 ++++++++++++++++++++++++++----- src/FtpNegotiationCommand.h | 4 ++++ src/PeerListenCommand.cc | 1 + 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 71fad353..a8a117fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-02-19 Tatsuhiro Tsujikawa + + Make listening socket non-block mode. + * src/FtpConnection.cc + * src/FtpNegotiationCommand.{h, cc} + * src/PeerListenCommand.cc + + Fixed the bug that cause slow ftp negotiation. + * src/FtpNegotiationCommand.{h, cc} + 2008-02-19 Tatsuhiro Tsujikawa Added basic tag to --enable-dht, --dht-listen-port option. diff --git a/src/FtpConnection.cc b/src/FtpConnection.cc index 407e010a..14879f51 100644 --- a/src/FtpConnection.cc +++ b/src/FtpConnection.cc @@ -109,7 +109,8 @@ SocketHandle FtpConnection::sendPort() const SocketHandle serverSocket; serverSocket->bind(0); serverSocket->beginListen(); - + serverSocket->setNonBlockingMode(); + std::pair addrinfo; socket->getAddrInfo(addrinfo); int32_t ipaddr[4]; diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc index 31da8250..074d474b 100644 --- a/src/FtpNegotiationCommand.cc +++ b/src/FtpNegotiationCommand.cc @@ -246,7 +246,7 @@ bool FtpNegotiationCommand::recvSize() { sequence = SEQ_FILE_PREPARATION; disableReadCheckSocket(); - setWriteCheckSocket(dataSocket); + //setWriteCheckSocket(dataSocket); //e->noWait = true; return false; @@ -261,7 +261,13 @@ bool FtpNegotiationCommand::recvSize() { return true; } +void FtpNegotiationCommand::afterFileAllocation() +{ + setReadCheckSocket(socket); +} + bool FtpNegotiationCommand::sendPort() { + afterFileAllocation(); serverSocket = ftp->sendPort(); sequence = SEQ_RECV_PORT; return false; @@ -280,6 +286,7 @@ bool FtpNegotiationCommand::recvPort() { } bool FtpNegotiationCommand::sendPasv() { + afterFileAllocation(); ftp->sendPasv(); sequence = SEQ_RECV_PASV; return false; @@ -347,12 +354,24 @@ bool FtpNegotiationCommand::recvRetr() { if(status != 150 && status != 125) { throw new DlAbortEx(EX_BAD_STATUS, status); } - if(e->option->get(PREF_FTP_PASV) != V_TRUE) { - assert(serverSocket->getSockfd() != -1); - dataSocket = serverSocket->acceptConnection(); + if(e->option->getAsBool(PREF_FTP_PASV)) { + sequence = SEQ_NEGOTIATION_COMPLETED; + return false; + } else { + disableReadCheckSocket(); + setReadCheckSocket(serverSocket); + sequence = SEQ_WAIT_CONNECTION; + return false; } - sequence = SEQ_NEGOTIATION_COMPLETED; +} +bool FtpNegotiationCommand::waitConnection() +{ + disableReadCheckSocket(); + setReadCheckSocket(socket); + dataSocket = serverSocket->acceptConnection(); + dataSocket->setBlockingMode(); + sequence = SEQ_NEGOTIATION_COMPLETED; return false; } @@ -399,6 +418,8 @@ bool FtpNegotiationCommand::processSequence(const SegmentHandle& segment) { return sendRetr(); case SEQ_RECV_RETR: return recvRetr(); + case SEQ_WAIT_CONNECTION: + return waitConnection(); default: abort(); } diff --git a/src/FtpNegotiationCommand.h b/src/FtpNegotiationCommand.h index da22cdce..0851131e 100644 --- a/src/FtpNegotiationCommand.h +++ b/src/FtpNegotiationCommand.h @@ -65,6 +65,7 @@ private: SEQ_RECV_REST, SEQ_SEND_RETR, SEQ_RECV_RETR, + SEQ_WAIT_CONNECTION, SEQ_NEGOTIATION_COMPLETED, SEQ_RETRY, SEQ_HEAD_OK, @@ -91,8 +92,11 @@ private: bool recvRest(); bool sendRetr(); bool recvRetr(); + bool waitConnection(); bool processSequence(const SharedHandle& segment); + void afterFileAllocation(); + SharedHandle dataSocket; SharedHandle serverSocket; int32_t sequence; diff --git a/src/PeerListenCommand.cc b/src/PeerListenCommand.cc index f7fd5e7c..05db0e57 100644 --- a/src/PeerListenCommand.cc +++ b/src/PeerListenCommand.cc @@ -70,6 +70,7 @@ int32_t PeerListenCommand::bindPort(IntSequence& seq) try { socket->bind(port); socket->beginListen(); + socket->setNonBlockingMode(); logger->info(MSG_LISTENING_PORT, cuid, port); return port;