Send ping packets in group chats every 30 seconds.

This commit is contained in:
irungentoo 2013-11-04 21:03:27 -05:00
parent 2e6250ee44
commit 78793140ef
2 changed files with 22 additions and 5 deletions

View File

@ -205,13 +205,14 @@ static int addpeer(Group_Chat *chat, uint8_t *client_id)
Group_Peer *temp; Group_Peer *temp;
temp = realloc(chat->group, sizeof(Group_Peer) * (chat->numpeers + 1)); temp = realloc(chat->group, sizeof(Group_Peer) * (chat->numpeers + 1));
memset(&(temp[chat->numpeers]), 0, sizeof(Group_Peer));
if (temp == NULL) if (temp == NULL)
return -1; return -1;
memset(&(temp[chat->numpeers]), 0, sizeof(Group_Peer));
chat->group = temp; chat->group = temp;
id_copy(chat->group[chat->numpeers].client_id, client_id); id_copy(chat->group[chat->numpeers].client_id, client_id);
chat->group[chat->numpeers].last_recv = unix_time();
++chat->numpeers; ++chat->numpeers;
return (chat->numpeers - 1); return (chat->numpeers - 1);
} }
@ -392,9 +393,9 @@ static int handle_data(Group_Chat *chat, uint8_t *data, uint32_t len)
if (chat->group[peernum].last_recv == temp_time) if (chat->group[peernum].last_recv == temp_time)
return 1; return 1;
chat->group[peernum].last_recv = temp_time;
*/ */
chat->group[peernum].last_recv = unix_time();
uint32_t message_num; uint32_t message_num;
memcpy(&message_num, data + crypto_box_PUBLICKEYBYTES, sizeof(uint32_t)); memcpy(&message_num, data + crypto_box_PUBLICKEYBYTES, sizeof(uint32_t));
message_num = ntohl(message_num); message_num = ntohl(message_num);
@ -461,7 +462,10 @@ static uint8_t send_data(Group_Chat *chat, uint8_t *data, uint32_t len, uint8_t
//TODO //TODO
id_copy(packet, chat->self_public_key); id_copy(packet, chat->self_public_key);
memcpy(packet + crypto_box_PUBLICKEYBYTES, &message_num, sizeof(message_num)); memcpy(packet + crypto_box_PUBLICKEYBYTES, &message_num, sizeof(message_num));
memcpy(packet + GROUP_DATA_MIN_SIZE, data, len);
if (len != 0)
memcpy(packet + GROUP_DATA_MIN_SIZE, data, len);
packet[crypto_box_PUBLICKEYBYTES + sizeof(message_num)] = message_id; packet[crypto_box_PUBLICKEYBYTES + sizeof(message_num)] = message_id;
return sendto_allpeers(chat, packet, len + GROUP_DATA_MIN_SIZE, 50); return sendto_allpeers(chat, packet, len + GROUP_DATA_MIN_SIZE, 50);
} }
@ -561,10 +565,22 @@ static void ping_close(Group_Chat *chat)
} }
} }
/* Interval in seconds to send ping messages */
#define GROUP_PING_INTERVAL 30
static void ping_group(Group_Chat *chat)
{
if (is_timeout(chat->last_sent_ping, GROUP_PING_INTERVAL)) {
if (send_data(chat, 0, 0, 0) != 0) /* Ping */
chat->last_sent_ping = unix_time();
}
}
void do_groupchat(Group_Chat *chat) void do_groupchat(Group_Chat *chat)
{ {
unix_time_update(); unix_time_update();
ping_close(chat); ping_close(chat);
ping_group(chat);
} }
void kill_groupchat(Group_Chat *chat) void kill_groupchat(Group_Chat *chat)

View File

@ -63,6 +63,7 @@ typedef struct Group_Chat {
uint32_t message_number; uint32_t message_number;
void (*group_message)(struct Group_Chat *m, int, uint8_t *, uint16_t, void *); void (*group_message)(struct Group_Chat *m, int, uint8_t *, uint16_t, void *);
void *group_message_userdata; void *group_message_userdata;
uint64_t last_sent_ping;
} Group_Chat; } Group_Chat;