diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-13 16:32:47 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-13 16:32:47 +0000 |
| commit | 495f02ebbceaf72c125d809f6ce38004b6dd580a (patch) | |
| tree | eb0fb6ddc1121aded8c92a49359c7f231ca0b90e /src/ReceiverMSEHandshakeCommand.cc | |
| parent | 281319e8cd3ca184dc3868c3d4740c24ab2607a4 (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.cc | 64 |
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 |
