summaryrefslogtreecommitdiff
path: root/src/PeerConnection.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-06-08 10:16:38 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-06-08 10:16:38 +0000
commit249194ba8da62a1846af9746f6d6e9d20c62e27e (patch)
tree834ec6729dc75b791112e218fdd759c6b298928c /src/PeerConnection.cc
parent5cbab84b65422ea5ac66e515edb33b1c34768974 (diff)
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)
Diffstat (limited to 'src/PeerConnection.cc')
-rw-r--r--src/PeerConnection.cc41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/PeerConnection.cc b/src/PeerConnection.cc
index dc3a844d..bec8c631 100644
--- a/src/PeerConnection.cc
+++ b/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);