summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-02-19 13:36:39 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-02-19 13:36:39 +0000
commit80bc9a8a21be66b3e59b2f830f16e0a9ddd7ad6e (patch)
treeb55de39f550e8dbed2874f893fa49587aa6893cd
parent766e092af32bb84429bd420cc77fadf6051326fe (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}
-rw-r--r--ChangeLog10
-rw-r--r--src/FtpConnection.cc3
-rw-r--r--src/FtpNegotiationCommand.cc31
-rw-r--r--src/FtpNegotiationCommand.h4
-rw-r--r--src/PeerListenCommand.cc1
5 files changed, 43 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 71fad353..a8a117fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
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}
+
+2008-02-19 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
+
Added basic tag to --enable-dht, --dht-listen-port option.
* src/HelpItemFactory.cc (createHelpItems)
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;