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

Returns cached data only when the previous receiveHandshake() is 
called
	with peek = true.
	* src/PeerConnection.cc (receiveHandshake)
	* src/PeerConnection.h (receiveHandshake)
pull/1/head
Tatsuhiro Tsujikawa 2008-06-09 14:55:12 +00:00
parent de9605815d
commit 811649149d
3 changed files with 16 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2008-06-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Returns cached data only when the previous receiveHandshake() is called
with peek = true.
* src/PeerConnection.cc (receiveHandshake)
* src/PeerConnection.h (receiveHandshake)
2008-06-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Changed default value of -s option from 1 to 5.

View File

@ -59,7 +59,8 @@ PeerConnection::PeerConnection(int32_t cuid,
resbufLength(0),
currentPayloadLength(0),
lenbufLength(0),
_encryptionEnabled(false)
_encryptionEnabled(false),
_prevPeek(false)
{}
PeerConnection::~PeerConnection() {}
@ -130,15 +131,19 @@ bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) {
bool PeerConnection::receiveHandshake(unsigned char* data, size_t& dataLength,
bool peek) {
assert(BtHandshakeMessage::MESSAGE_LENGTH >= resbufLength);
bool retval = true;
if(!peek && resbufLength) {
if(_prevPeek && !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.
_prevPeek = false;
retval = BtHandshakeMessage::MESSAGE_LENGTH <= resbufLength;
} else {
_prevPeek = peek;
size_t remaining = BtHandshakeMessage::MESSAGE_LENGTH-resbufLength;
if(remaining > 0 && !socket->isReadable(0)) {
dataLength = 0;

View File

@ -68,6 +68,8 @@ private:
SharedHandle<ARC4Encryptor> _encryptor;
SharedHandle<ARC4Decryptor> _decryptor;
bool _prevPeek;
void readData(unsigned char* data, size_t& length, bool encryption);
void sendData(const unsigned char* data, size_t length, bool encryption);