コード例 #1
0
ファイル: group_chats.c プロジェクト: AndrewShmig/toxcore
static int send_getnodes(const Group_Chat *chat, IP_Port ip_port, int peernum)
{
    if ((uint32_t)peernum >= chat->numpeers)
        return -1;

    if (!is_timeout(chat->group[peernum].last_pinged, GROUP_PING_TIMEOUT))
        return -1;

    getnodes_data contents;
    contents.pingid = random_64b();

    chat->group[peernum].last_pinged = unix_time();
    chat->group[peernum].pingid = contents.pingid;
    chat->group[peernum].ping_via = ip_port;

    if (chat->assoc) {
        IPPTs ippts;
        ippts.timestamp = unix_time();
        ippts.ip_port = ip_port;

        Assoc_add_entry(chat->assoc, chat->group[peernum].client_id, &ippts, NULL, 1);
    }

    return send_groupchatpacket(chat, ip_port, chat->group[peernum].client_id, (uint8_t *)&contents, sizeof(contents),
                                CRYPTO_PACKET_GROUP_CHAT_GET_NODES);
}
コード例 #2
0
/*
 * Send data to all peers in close peer list.
 *
 * return the number of peers the packet was sent to.
 */
static uint8_t sendto_allpeers(Group_Chat *chat, uint8_t *data, uint16_t length, uint8_t request_id)
{
    uint16_t sent = 0;
    uint32_t i;

    for (i = 0; i < GROUP_CLOSE_CONNECTIONS; ++i) {
        if (ip_isset(&chat->close[i].ip_port.ip) &&
                !is_timeout(chat->close[i].last_recv, BAD_GROUPNODE_TIMEOUT)) {
            if (send_groupchatpacket(chat, chat->close[i].ip_port, chat->close[i].client_id,
                                     data, length, request_id) == 0)
                ++sent;
        }
    }

    return sent;
}
コード例 #3
0
static int send_getnodes(Group_Chat *chat, IP_Port ip_port, int peernum)
{
    if ((uint32_t)peernum >= chat->numpeers)
        return -1;

    if (!is_timeout(chat->group[peernum].last_pinged, PING_TIMEOUT))
        return -1;

    getnodes_data contents;
    contents.pingid = ((uint64_t)random_int() << 32) + random_int();

    chat->group[peernum].last_pinged = unix_time();
    chat->group[peernum].pingid = contents.pingid;

    return send_groupchatpacket(chat, ip_port, chat->group[peernum].client_id, (uint8_t *)&contents, sizeof(contents), 48);
}
コード例 #4
0
static int send_sendnodes(Group_Chat *chat, IP_Port ip_port, int peernum, uint64_t pingid)
{
    if ((uint32_t)peernum >= chat->numpeers)
        return -1;

    sendnodes_data contents;
    contents.pingid = pingid;
    uint32_t i, j = 0;

    for (i = 0; i < GROUP_CLOSE_CONNECTIONS; ++i) {
        if (!is_timeout(chat->close[i].last_recv, BAD_GROUPNODE_TIMEOUT)) {
            id_copy(contents.nodes[j].client_id, chat->close[i].client_id);
            contents.nodes[j].ip_port = chat->close[i].ip_port;
            ++j;
        }
    }

    return send_groupchatpacket(chat, ip_port, chat->group[peernum].client_id, (uint8_t *)&contents,
                                sizeof(contents.pingid) + sizeof(groupchat_nodes) * j, CRYPTO_PACKET_GROUP_CHAT_SEND_NODES);
}