summaryrefslogtreecommitdiff
path: root/src/ReceiverMSEHandshakeCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-13 16:32:47 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-13 16:32:47 +0000
commit495f02ebbceaf72c125d809f6ce38004b6dd580a (patch)
treeeb0fb6ddc1121aded8c92a49359c7f231ca0b90e /src/ReceiverMSEHandshakeCommand.cc
parent281319e8cd3ca184dc3868c3d4740c24ab2607a4 (diff)
2008-09-14 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Use non-blocking socket for TCP communication to avoid possible blocking due to buffer full. * src/AbstractProxyRequestCommand.cc * src/FtpConnection.cc * src/FtpConnection.h * src/FtpNegotiationCommand.cc * src/FtpNegotiationCommand.h * src/HttpConnection.cc * src/HttpConnection.h * src/HttpRequestCommand.cc * src/InitiatorMSEHandshakeCommand.cc * src/InitiatorMSEHandshakeCommand.h * src/MSEHandshake.cc * src/MSEHandshake.h * src/Makefile.am * src/PeerConnection.cc * src/PeerConnection.h * src/PeerInteractionCommand.cc * src/PeerListenCommand.cc * src/ReceiverMSEHandshakeCommand.cc * src/ReceiverMSEHandshakeCommand.h * src/SocketBuffer.cc * src/SocketBuffer.h * src/SocketCore.cc * src/SocketCore.h
Diffstat (limited to 'src/ReceiverMSEHandshakeCommand.cc')
-rw-r--r--src/ReceiverMSEHandshakeCommand.cc64
1 files changed, 45 insertions, 19 deletions
diff --git a/src/ReceiverMSEHandshakeCommand.cc b/src/ReceiverMSEHandshakeCommand.cc
index 997b98b2..73f20ef4 100644
--- a/src/ReceiverMSEHandshakeCommand.cc
+++ b/src/ReceiverMSEHandshakeCommand.cc
@@ -106,11 +106,21 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
}
case RECEIVER_WAIT_KEY: {
if(_mseHandshake->receivePublicKey()) {
- _mseHandshake->sendPublicKey();
- _sequence = RECEIVER_FIND_HASH_MARKER;
+ if(_mseHandshake->sendPublicKey()) {
+ _sequence = RECEIVER_FIND_HASH_MARKER;
+ } else {
+ setWriteCheckSocket(socket);
+ _sequence = RECEIVER_SEND_KEY_PENDING;
+ }
}
break;
}
+ case RECEIVER_SEND_KEY_PENDING:
+ if(_mseHandshake->sendPublicKey()) {
+ disableWriteCheckSocket();
+ _sequence = RECEIVER_FIND_HASH_MARKER;
+ }
+ break;
case RECEIVER_FIND_HASH_MARKER: {
if(_mseHandshake->findReceiverHashMarker()) {
_sequence = RECEIVER_RECEIVE_PAD_C_LENGTH;
@@ -137,30 +147,46 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
}
case RECEIVER_RECEIVE_IA: {
if(_mseHandshake->receiveReceiverIA()) {
- _mseHandshake->sendReceiverStep2();
- SharedHandle<PeerConnection> peerConnection
- (new PeerConnection(cuid, socket, e->option));
- if(_mseHandshake->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) {
- peerConnection->enableEncryption(_mseHandshake->getEncryptor(),
- _mseHandshake->getDecryptor());
+ if(_mseHandshake->sendReceiverStep2()) {
+ createCommand();
+ return true;
+ } else {
+ setWriteCheckSocket(socket);
+ _sequence = RECEIVER_SEND_STEP2_PENDING;
}
- if(_mseHandshake->getIALength() > 0) {
- peerConnection->presetBuffer(_mseHandshake->getIA(),
- _mseHandshake->getIALength());
- }
- // TODO add _mseHandshake->getInfoHash() to PeerReceiveHandshakeCommand
- // as a hint. If this info hash and one in BitTorrent Handshake does not
- // match, then drop connection.
- Command* c =
- new PeerReceiveHandshakeCommand(cuid, peer, e, socket, peerConnection);
- e->commands.push_back(c);
- return true;
}
break;
}
+ case RECEIVER_SEND_STEP2_PENDING:
+ if(_mseHandshake->sendReceiverStep2()) {
+ disableWriteCheckSocket();
+ createCommand();
+ return true;
+ }
+ break;
}
e->commands.push_back(this);
return false;
}
+void ReceiverMSEHandshakeCommand::createCommand()
+{
+ SharedHandle<PeerConnection> peerConnection
+ (new PeerConnection(cuid, socket, e->option));
+ if(_mseHandshake->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) {
+ peerConnection->enableEncryption(_mseHandshake->getEncryptor(),
+ _mseHandshake->getDecryptor());
+ }
+ if(_mseHandshake->getIALength() > 0) {
+ peerConnection->presetBuffer(_mseHandshake->getIA(),
+ _mseHandshake->getIALength());
+ }
+ // TODO add _mseHandshake->getInfoHash() to PeerReceiveHandshakeCommand
+ // as a hint. If this info hash and one in BitTorrent Handshake does not
+ // match, then drop connection.
+ Command* c =
+ new PeerReceiveHandshakeCommand(cuid, peer, e, socket, peerConnection);
+ e->commands.push_back(c);
+}
+
} // namespace aria2