diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-02-19 13:36:39 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-02-19 13:36:39 +0000 |
| commit | 80bc9a8a21be66b3e59b2f830f16e0a9ddd7ad6e (patch) | |
| tree | b55de39f550e8dbed2874f893fa49587aa6893cd /src | |
| parent | 766e092af32bb84429bd420cc77fadf6051326fe (diff) | |
2008-02-19 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
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}
Diffstat (limited to 'src')
| -rw-r--r-- | src/FtpConnection.cc | 3 | ||||
| -rw-r--r-- | src/FtpNegotiationCommand.cc | 31 | ||||
| -rw-r--r-- | src/FtpNegotiationCommand.h | 4 | ||||
| -rw-r--r-- | src/PeerListenCommand.cc | 1 |
4 files changed, 33 insertions, 6 deletions
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<std::string, int32_t> 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>& segment); + void afterFileAllocation(); + SharedHandle<SocketCore> dataSocket; SharedHandle<SocketCore> 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; |
