static void savePeers (tr_variant * dict, const tr_torrent * tor) { int count; tr_pex * pex; count = tr_peerMgrGetPeers ((tr_torrent*) tor, &pex, TR_AF_INET, TR_PEERS_INTERESTING, MAX_REMEMBERED_PEERS); if (count > 0) tr_variantDictAddRaw (dict, TR_KEY_peers2, pex, sizeof (tr_pex) * count); tr_free (pex); count = tr_peerMgrGetPeers ((tr_torrent*) tor, &pex, TR_AF_INET6, TR_PEERS_INTERESTING, MAX_REMEMBERED_PEERS); if (count > 0) tr_variantDictAddRaw (dict, TR_KEY_peers2_6, pex, sizeof (tr_pex) * count); tr_free (pex); }
static void savePeers( tr_benc * dict, const tr_torrent * tor ) { int count; tr_pex * pex; count = tr_peerMgrGetPeers( (tr_torrent*) tor, &pex, TR_AF_INET, TR_PEERS_ALL, MAX_REMEMBERED_PEERS ); if( count > 0 ) tr_bencDictAddRaw( dict, KEY_PEERS, pex, sizeof( tr_pex ) * count ); tr_free( pex ); count = tr_peerMgrGetPeers( (tr_torrent*) tor, &pex, TR_AF_INET6, TR_PEERS_ALL, MAX_REMEMBERED_PEERS ); if( count > 0 ) tr_bencDictAddRaw( dict, KEY_PEERS6, pex, sizeof( tr_pex ) * count ); tr_free( pex ); }
static void savePeers( tr_benc * dict, const tr_torrent * tor ) { tr_pex * pex = NULL; const int count = tr_peerMgrGetPeers( tor->session->peerMgr, tor->info.hash, &pex ); if( count > 0 ) tr_bencDictAddRaw( dict, KEY_PEERS, pex, sizeof( tr_pex ) * count ); tr_free( pex ); }
// Envio de mensagem PEX static void sendPex(tr_peerMsgs * msgs) { if (msgs->peerSupportsPex && tr_torrentAllowsPex(msgs->torrent)) { (...) // Seleciona os 50 nós conectados e que são úteis ao torrent sendo baixado. const int newCount = tr_peerMgrGetPeers(msgs->torrent, &newPex, TR_AF_INET, TR_PEERS_CONNECTED, MAX_PEX_PEER_COUNT); (...) /* build the diffs */ diffs.added = tr_new(tr_pex, newCount); diffs.addedCount = 0; diffs.dropped = tr_new(tr_pex, msgs->pexCount); diffs.droppedCount = 0; diffs.elements = tr_new(tr_pex, newCount + msgs->pexCount); diffs.elementCount = 0; tr_set_compare(msgs->pex, msgs->pexCount, newPex, newCount, tr_pexCompare, sizeof(tr_pex), pexDroppedCb, pexAddedCb, pexElementCb, &diffs); (...) // Se tiverem novos peers a serem enviados, o faz. if (diffs.addedCount || diffs.droppedCount || !diffs6.addedCount || diffs6.droppedCount) { int i; tr_variant val; uint8_t * tmp, *walk; // variáveis temporárias struct evbuffer * payload; // listas de peers do PEX struct evbuffer * out = msgs->outMessages; // mensagem a ser enviada /* update peer */ (...) msgs->pex = diffs.elements; msgs->pexCount = diffs.elementCount; (...) /* build the pex payload */ tr_variantInitDict(&val, 3); if (diffs.addedCount > 0) { /* "added" */ tmp = walk = tr_new(uint8_t, diffs.addedCount * 6); for (i = 0; i < diffs.addedCount; ++i) { memcpy(walk, &diffs.added[i].addr.addr, 4); walk += 4; memcpy(walk, &diffs.added[i].port, 2); walk += 2; } (...) tr_variantDictAddRaw(&val, TR_KEY_added, tmp, walk - tmp); (...) }