예제 #1
0
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);
}
예제 #2
0
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 );
}
예제 #3
0
파일: resume.c 프로젝트: fangang190/canary
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 );
}
예제 #4
0
파일: 026-send-pex.c 프로젝트: paulochf/tcc
// 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);
                (...)
            }