summaryrefslogtreecommitdiff
path: root/src/PeerReceiveHandshakeCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-09 23:57:07 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-09 23:57:07 +0900
commit3e67079087577e8f3f4918c2c0822fc0420dc190 (patch)
tree62f78c43c5427ef5eac8893b2e8bb1ba24a46f8e /src/PeerReceiveHandshakeCommand.cc
parent1818f2ed5537232316d8a9aa21d6fa6318c273a9 (diff)
Rewritten NAT check handling.
We simplified PeerConnection::receiveHandshake(). DefaultBtMessageReceiver and PeerReceiverHandshakeCommand look PeerConnection's buffer and do NAT check handling themselves.
Diffstat (limited to 'src/PeerReceiveHandshakeCommand.cc')
-rw-r--r--src/PeerReceiveHandshakeCommand.cc19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/PeerReceiveHandshakeCommand.cc b/src/PeerReceiveHandshakeCommand.cc
index 5af632a5..e34a749e 100644
--- a/src/PeerReceiveHandshakeCommand.cc
+++ b/src/PeerReceiveHandshakeCommand.cc
@@ -33,6 +33,9 @@
*/
/* copyright --> */
#include "PeerReceiveHandshakeCommand.h"
+
+#include <cstring>
+
#include "PeerConnection.h"
#include "DownloadEngine.h"
#include "BtHandshakeMessage.h"
@@ -87,13 +90,15 @@ bool PeerReceiveHandshakeCommand::exitBeforeExecute()
bool PeerReceiveHandshakeCommand::executeInternal()
{
- unsigned char data[BtHandshakeMessage::MESSAGE_LENGTH];
- size_t dataLength = BtHandshakeMessage::MESSAGE_LENGTH;
- // ignore return value. The received data is kept in PeerConnection object
- // because of peek = true.
- peerConnection_->receiveHandshake(data, dataLength, true);
- // To handle tracker's NAT-checking feature
- if(dataLength >= 48) {
+ // Handle tracker's NAT-checking feature
+ if(peerConnection_->getBufferLength() < 48) {
+ size_t dataLength = 0;
+ // Ignore return value. The received data is kept in
+ // PeerConnection object because of peek = true.
+ peerConnection_->receiveHandshake(0, dataLength, true);
+ }
+ if(peerConnection_->getBufferLength() >= 48) {
+ const unsigned char* data = peerConnection_->getBuffer();
// check info_hash
std::string infoHash = std::string(&data[28], &data[28+INFO_HASH_LENGTH]);