diff --git a/src/bitdht/bdiface.h b/src/bitdht/bdiface.h index 12bf8f4..8c211d3 100644 --- a/src/bitdht/bdiface.h +++ b/src/bitdht/bdiface.h @@ -173,8 +173,8 @@ virtual void addCallback(BitDhtCallback *cb) = 0; virtual void removeCallback(BitDhtCallback *cb) = 0; /***** Get Results Details *****/ -virtual int getDhtPeerAddress(bdNodeId *id, struct sockaddr_in &from) = 0; -virtual int getDhtValue(bdNodeId *id, std::string key, std::string &value) = 0; +virtual int getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from) = 0; +virtual int getDhtValue(const bdNodeId *id, std::string key, std::string &value) = 0; }; diff --git a/src/bitdht/bdmanager.cc b/src/bitdht/bdmanager.cc index 74e23eb..c42f794 100644 --- a/src/bitdht/bdmanager.cc +++ b/src/bitdht/bdmanager.cc @@ -94,6 +94,10 @@ void bdNodeManager::addFindNode(bdNodeId *id, uint32_t qflags) peer.mId.id = (*id); peer.mStatus = BITDHT_QUERY_READY; //QUERYING; peer.mQFlags = qflags; + + peer.mDhtAddr.sin_addr.s_addr = 0; + peer.mDhtAddr.sin_port = 0; + mActivePeers[*id] = peer; #ifdef DEBUG_MGR std::cerr << "bdNodeManager::addFindNode() Added QueryPeer as READY...."; @@ -291,6 +295,7 @@ int bdNodeManager::checkStatus() bool doPing = false; bool doRemove = false; bool doCallback = false; + bool doSaveAddress = false; uint32_t callbackStatus = 0; switch(it->second.mStatus) @@ -358,6 +363,7 @@ int bdNodeManager::checkStatus() //foundId = doRemove = true; doCallback = true; + doSaveAddress = true; callbackStatus = BITDHT_MGR_QUERY_PEER_ONLINE; } break; @@ -422,6 +428,18 @@ int bdNodeManager::checkStatus() pit->second.mStatus = it->second.mStatus; } + if (doSaveAddress) + { + if (it->second.mResults.size() > 0) + { + pit->second.mDhtAddr = it->second.mResults.front().addr; + } + else + { + pit->second.mDhtAddr.sin_addr.s_addr = 0; + pit->second.mDhtAddr.sin_port = 0; + } + } /* add successful queries to ping list */ if (doPing) @@ -553,7 +571,7 @@ void bdNodeManager::findDhtValue(bdNodeId * /*id*/, std::string /*key*/, uint32_ /***** Get Results Details *****/ -int bdNodeManager::getDhtPeerAddress(bdNodeId *id, struct sockaddr_in & /*from*/) +int bdNodeManager::getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from) { #ifdef DEBUG_MGR std::cerr << "bdNodeManager::getDhtPeerAddress() Id: "; @@ -563,10 +581,34 @@ int bdNodeManager::getDhtPeerAddress(bdNodeId *id, struct sockaddr_in & /*from*/ (void) id; #endif - return 1; + std::map::iterator pit; + pit = mActivePeers.find(*id); + + std::cerr << "bdNodeManager::getDhtPeerAddress() Id: "; + mFns->bdPrintNodeId(std::cerr, id); + std::cerr << std::endl; + + if (pit != mActivePeers.end()) + { + std::cerr << "bdNodeManager::getDhtPeerAddress() Found ActiveQuery"; + std::cerr << std::endl; + + if (pit->second.mStatus == BITDHT_QUERY_SUCCESS) + { + from = pit->second.mDhtAddr; + + std::cerr << "bdNodeManager::getDhtPeerAddress() Found Peer Address:"; + std::cerr << inet_ntoa(from.sin_addr) << ":" << htons(from.sin_port); + std::cerr << std::endl; + + return 1; + } + } + return 0; + } -int bdNodeManager::getDhtValue(bdNodeId *id, std::string key, std::string & /*value*/) +int bdNodeManager::getDhtValue(const bdNodeId *id, std::string key, std::string & /*value*/) { #ifdef DEBUG_MGR std::cerr << "bdNodeManager::getDhtValue() Id: "; diff --git a/src/bitdht/bdmanager.h b/src/bitdht/bdmanager.h index 05c03cc..641877b 100644 --- a/src/bitdht/bdmanager.h +++ b/src/bitdht/bdmanager.h @@ -66,6 +66,7 @@ class bdQueryPeer uint32_t mQFlags; time_t mLastQuery; time_t mLastFound; + struct sockaddr_in mDhtAddr; }; @@ -108,8 +109,8 @@ virtual void addCallback(BitDhtCallback *cb); virtual void removeCallback(BitDhtCallback *cb); /***** Get Results Details *****/ -virtual int getDhtPeerAddress(bdNodeId *id, struct sockaddr_in &from); -virtual int getDhtValue(bdNodeId *id, std::string key, std::string &value); +virtual int getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from); +virtual int getDhtValue(const bdNodeId *id, std::string key, std::string &value); /******************* Internals *************************/ diff --git a/src/bitdht/bdnode.cc b/src/bitdht/bdnode.cc index c6a3080..847cb71 100644 --- a/src/bitdht/bdnode.cc +++ b/src/bitdht/bdnode.cc @@ -1348,27 +1348,40 @@ void bdNode::msgin_pong(bdId *id, bdToken *transId, bdToken *versionId) bool sameAppl = false; bool sameVersion = false; - /* check two bytes */ - if ((versionId->len > 2) && (mDhtVersion.size() > 2) && - (versionId->data[0] == mDhtVersion[0]) && (versionId->data[1] == mDhtVersion[1])) + if (versionId) { - sameDhtEngine = true; + +#ifdef DEBUG_NODE_MSGIN + std::cerr << "bdNode::msgin_pong() Peer Version: "; + for(int i = 0; i < versionId->len; i++) + { + std::cerr << versionId->data[i]; + } + std::cerr << std::endl; +#endif + + /* check two bytes */ + if ((versionId->len > 2) && (mDhtVersion.size() > 2) && + (versionId->data[0] == mDhtVersion[0]) && (versionId->data[1] == mDhtVersion[1])) + { + sameDhtEngine = true; + } + + /* check two bytes */ + if ((versionId->len > 4) && (mDhtVersion.size() > 4) && + (versionId->data[2] == mDhtVersion[2]) && (versionId->data[3] == mDhtVersion[3])) + { + sameAppl = true; + } + + /* check two bytes */ + if ((versionId->len > 6) && (mDhtVersion.size() > 6) && + (versionId->data[4] == mDhtVersion[4]) && (versionId->data[5] == mDhtVersion[5])) + { + sameVersion = true; + } } - - /* check two bytes */ - if ((versionId->len > 4) && (mDhtVersion.size() > 4) && - (versionId->data[2] == mDhtVersion[2]) && (versionId->data[3] == mDhtVersion[3])) - { - sameAppl = true; - } - - /* check two bytes */ - if ((versionId->len > 6) && (mDhtVersion.size() > 6) && - (versionId->data[4] == mDhtVersion[4]) && (versionId->data[5] == mDhtVersion[5])) - { - sameVersion = true; - } - + uint32_t peerflags = BITDHT_PEER_STATUS_RECV_PONG; /* should have id too */ if (sameDhtEngine) diff --git a/src/udp/udpbitdht.cc b/src/udp/udpbitdht.cc index a01f3a3..dc53b5f 100644 --- a/src/udp/udpbitdht.cc +++ b/src/udp/udpbitdht.cc @@ -103,14 +103,14 @@ void UdpBitDht::removeCallback(BitDhtCallback *cb) mBitDhtManager->removeCallback(cb); } -int UdpBitDht::getDhtPeerAddress(bdNodeId *id, struct sockaddr_in &from) +int UdpBitDht::getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from) { bdStackMutex stack(dhtMtx); /********** MUTEX LOCKED *************/ return mBitDhtManager->getDhtPeerAddress(id, from); } -int UdpBitDht::getDhtValue(bdNodeId *id, std::string key, std::string &value) +int UdpBitDht::getDhtValue(const bdNodeId *id, std::string key, std::string &value) { bdStackMutex stack(dhtMtx); /********** MUTEX LOCKED *************/ diff --git a/src/udp/udpbitdht.h b/src/udp/udpbitdht.h index f27fc37..401e433 100644 --- a/src/udp/udpbitdht.h +++ b/src/udp/udpbitdht.h @@ -68,8 +68,8 @@ virtual void addCallback(BitDhtCallback *cb); virtual void removeCallback(BitDhtCallback *cb); /***** Get Results Details *****/ -virtual int getDhtPeerAddress(bdNodeId *id, struct sockaddr_in &from); -virtual int getDhtValue(bdNodeId *id, std::string key, std::string &value); +virtual int getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from); +virtual int getDhtValue(const bdNodeId *id, std::string key, std::string &value); /******************* Internals *************************/ /***** Iteration / Loop Management *****/