Browse Source

2008-06-08 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Returns cached data without checking whether socket is readable
	if the cache is available.
	* src/PeerConnection.cc (receiveHandshake)
Tatsuhiro Tsujikawa 17 năm trước cách đây
mục cha
commit
249194ba8d
2 tập tin đã thay đổi với 31 bổ sung16 xóa
  1. 6 0
      ChangeLog
  2. 25 16
      src/PeerConnection.cc

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+2008-06-08  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Returns cached data without checking whether socket is readable
+	if the cache is available.
+	* src/PeerConnection.cc (receiveHandshake)
+
 2008-06-06  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Included stdint.h

+ 25 - 16
src/PeerConnection.cc

@@ -130,24 +130,33 @@ bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) {
 
 bool PeerConnection::receiveHandshake(unsigned char* data, size_t& dataLength,
 				      bool peek) {
-  size_t remaining = BtHandshakeMessage::MESSAGE_LENGTH-resbufLength;
-  if(remaining > 0 && !socket->isReadable(0)) {
-    dataLength = 0;
-    return false;
-  }
   bool retval = true;
-  if(remaining > 0) {
-    size_t temp = remaining;
-    readData(resbuf+resbufLength, remaining, _encryptionEnabled);
-    if(remaining == 0) {
-      // we got EOF
-      logger->debug("CUID#%d - In PeerConnection::receiveHandshake(), remain=%zu",
-		    cuid, temp);
-      throw DlAbortEx(EX_EOF_FROM_PEER);
+  if(!peek && resbufLength) {
+    // We have data in previous peek.
+    // There is a chance that socket is readable because of EOF, for example,
+    // official bttrack shutdowns socket after sending first 48 bytes of
+    // handshake in its NAT checking.
+    // So if there are data in resbuf, return it without checking socket
+    // status.
+  } else {
+    size_t remaining = BtHandshakeMessage::MESSAGE_LENGTH-resbufLength;
+    if(remaining > 0 && !socket->isReadable(0)) {
+      dataLength = 0;
+      return false;
     }
-    resbufLength += remaining;
-    if(BtHandshakeMessage::MESSAGE_LENGTH > resbufLength) {
-      retval = false;
+    if(remaining > 0) {
+      size_t temp = remaining;
+      readData(resbuf+resbufLength, remaining, _encryptionEnabled);
+      if(remaining == 0) {
+	// we got EOF
+	logger->debug("CUID#%d - In PeerConnection::receiveHandshake(), remain=%zu",
+		      cuid, temp);
+	throw DlAbortEx(EX_EOF_FROM_PEER);
+      }
+      resbufLength += remaining;
+      if(BtHandshakeMessage::MESSAGE_LENGTH > resbufLength) {
+	retval = false;
+      }
     }
   }
   size_t writeLength = std::min(resbufLength, dataLength);