Changeset View
Changeset View
Standalone View
Standalone View
src/seeder/bitcoin.cpp
Show All 14 Lines | class CNode { | ||||
CDataStream vRecv; | CDataStream vRecv; | ||||
unsigned int nHeaderStart; | unsigned int nHeaderStart; | ||||
unsigned int nMessageStart; | unsigned int nMessageStart; | ||||
int nVersion; | int nVersion; | ||||
std::string strSubVer; | std::string strSubVer; | ||||
int nStartingHeight; | int nStartingHeight; | ||||
std::vector<CAddress> *vAddr; | std::vector<CAddress> *vAddr; | ||||
int ban; | int ban; | ||||
int64 doneAfter; | int64_t doneAfter; | ||||
CAddress you; | CAddress you; | ||||
int GetTimeout() { return you.IsTor() ? 120 : 30; } | int GetTimeout() { return you.IsTor() ? 120 : 30; } | ||||
void BeginMessage(const char *pszCommand) { | void BeginMessage(const char *pszCommand) { | ||||
if (nHeaderStart != -1) AbortMessage(); | if (nHeaderStart != -1) AbortMessage(); | ||||
nHeaderStart = vSend.size(); | nHeaderStart = vSend.size(); | ||||
vSend << CMessageHeader(pszCommand, 0); | vSend << CMessageHeader(pszCommand, 0); | ||||
Show All 36 Lines | void Send() { | ||||
vSend.erase(vSend.begin(), vSend.begin() + nBytes); | vSend.erase(vSend.begin(), vSend.begin() + nBytes); | ||||
} else { | } else { | ||||
close(sock); | close(sock); | ||||
sock = INVALID_SOCKET; | sock = INVALID_SOCKET; | ||||
} | } | ||||
} | } | ||||
void PushVersion() { | void PushVersion() { | ||||
int64 nTime = time(nullptr); | int64_t nTime = time(nullptr); | ||||
uint64 nLocalNonce = BITCOIN_SEED_NONCE; | uint64_t nLocalNonce = BITCOIN_SEED_NONCE; | ||||
int64 nLocalServices = 0; | int64_t nLocalServices = 0; | ||||
CAddress me(CService("0.0.0.0")); | CAddress me(CService("0.0.0.0")); | ||||
BeginMessage("version"); | BeginMessage("version"); | ||||
int nBestHeight = GetRequireHeight(); | int nBestHeight = GetRequireHeight(); | ||||
std::string ver = "/bitcoin-seeder:0.01/"; | std::string ver = "/bitcoin-seeder:0.01/"; | ||||
vSend << PROTOCOL_VERSION << nLocalServices << nTime << you << me | vSend << PROTOCOL_VERSION << nLocalServices << nTime << you << me | ||||
<< nLocalNonce << ver << nBestHeight; | << nLocalNonce << ver << nBestHeight; | ||||
EndMessage(); | EndMessage(); | ||||
} | } | ||||
void GotVersion() { | void GotVersion() { | ||||
// printf("\n%s: version %i\n", ToString(you).c_str(), nVersion); | // printf("\n%s: version %i\n", ToString(you).c_str(), nVersion); | ||||
if (vAddr) { | if (vAddr) { | ||||
BeginMessage("getaddr"); | BeginMessage("getaddr"); | ||||
EndMessage(); | EndMessage(); | ||||
doneAfter = time(nullptr) + GetTimeout(); | doneAfter = time(nullptr) + GetTimeout(); | ||||
} else { | } else { | ||||
doneAfter = time(nullptr) + 1; | doneAfter = time(nullptr) + 1; | ||||
} | } | ||||
} | } | ||||
bool ProcessMessage(std::string strCommand, CDataStream &vRecv) { | bool ProcessMessage(std::string strCommand, CDataStream &vRecv) { | ||||
// printf("%s: RECV %s\n", ToString(you).c_str(), | // printf("%s: RECV %s\n", ToString(you).c_str(), | ||||
// strCommand.c_str()); | // strCommand.c_str()); | ||||
if (strCommand == "version") { | if (strCommand == "version") { | ||||
int64 nTime; | int64_t nTime; | ||||
CAddress addrMe; | CAddress addrMe; | ||||
CAddress addrFrom; | CAddress addrFrom; | ||||
uint64 nNonce = 1; | uint64_t nNonce = 1; | ||||
vRecv >> nVersion >> you.nServices >> nTime >> addrMe; | vRecv >> nVersion >> you.nServices >> nTime >> addrMe; | ||||
if (nVersion == 10300) nVersion = 300; | if (nVersion == 10300) nVersion = 300; | ||||
if (nVersion >= 106 && !vRecv.empty()) vRecv >> addrFrom >> nNonce; | if (nVersion >= 106 && !vRecv.empty()) vRecv >> addrFrom >> nNonce; | ||||
if (nVersion >= 106 && !vRecv.empty()) vRecv >> strSubVer; | if (nVersion >= 106 && !vRecv.empty()) vRecv >> strSubVer; | ||||
if (nVersion >= 209 && !vRecv.empty()) vRecv >> nStartingHeight; | if (nVersion >= 209 && !vRecv.empty()) vRecv >> nStartingHeight; | ||||
if (nVersion >= 209) { | if (nVersion >= 209) { | ||||
BeginMessage("verack"); | BeginMessage("verack"); | ||||
Show All 13 Lines | bool ProcessMessage(std::string strCommand, CDataStream &vRecv) { | ||||
return false; | return false; | ||||
} | } | ||||
if (strCommand == "addr" && vAddr) { | if (strCommand == "addr" && vAddr) { | ||||
std::vector<CAddress> vAddrNew; | std::vector<CAddress> vAddrNew; | ||||
vRecv >> vAddrNew; | vRecv >> vAddrNew; | ||||
// printf("%s: got %i addresses\n", ToString(you).c_str(), | // printf("%s: got %i addresses\n", ToString(you).c_str(), | ||||
// (int)vAddrNew.size()); | // (int)vAddrNew.size()); | ||||
int64 now = time(nullptr); | int64_t now = time(nullptr); | ||||
std::vector<CAddress>::iterator it = vAddrNew.begin(); | std::vector<CAddress>::iterator it = vAddrNew.begin(); | ||||
if (vAddrNew.size() > 1) { | if (vAddrNew.size() > 1) { | ||||
if (doneAfter == 0 || doneAfter > now + 1) doneAfter = now + 1; | if (doneAfter == 0 || doneAfter > now + 1) doneAfter = now + 1; | ||||
} | } | ||||
while (it != vAddrNew.end()) { | while (it != vAddrNew.end()) { | ||||
CAddress &addr = *it; | CAddress &addr = *it; | ||||
// printf("%s: got address %s\n", ToString(you).c_str(), | // printf("%s: got address %s\n", ToString(you).c_str(), | ||||
// addr.ToString().c_str(), (int)(vAddr->size())); | // addr.ToString().c_str(), (int)(vAddr->size())); | ||||
▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | CNode(const CService &ip, std::vector<CAddress> *vAddrIn) | ||||
vRecv.SetVersion(209); | vRecv.SetVersion(209); | ||||
} | } | ||||
} | } | ||||
bool Run() { | bool Run() { | ||||
bool res = true; | bool res = true; | ||||
if (!ConnectSocket(you, sock)) return false; | if (!ConnectSocket(you, sock)) return false; | ||||
PushVersion(); | PushVersion(); | ||||
Send(); | Send(); | ||||
int64 now; | int64_t now; | ||||
while (now = time(nullptr), ban == 0 && | while (now = time(nullptr), ban == 0 && | ||||
(doneAfter == 0 || doneAfter > now) && | (doneAfter == 0 || doneAfter > now) && | ||||
sock != INVALID_SOCKET) { | sock != INVALID_SOCKET) { | ||||
char pchBuf[0x10000]; | char pchBuf[0x10000]; | ||||
fd_set set; | fd_set set; | ||||
FD_ZERO(&set); | FD_ZERO(&set); | ||||
FD_SET(sock, &set); | FD_SET(sock, &set); | ||||
struct timeval wa; | struct timeval wa; | ||||
▲ Show 20 Lines • Show All 79 Lines • Show Last 20 Lines |