u l int process_handshake_msg(Peer *peer,unsigned char *buff,int len)
功能:處理接收到的一條握手訊息。
參數:從peer接收到這條握手訊息;buff指向握手訊息;len為buff的長度。函數實現的代碼如下:
int process_handshake_msg(Peer *peer,unsigned char *buff,int len)
{
if(peer==NULL || buff==NULL) return -1;
if(memcmp(info_hash,buff+28,20) != 0) { // 若info_hash不一致則關閉串連
peer->state = CLOSING;
// 丟棄發送緩衝區中的資料
discard_send_buffer(peer);
clear_btcache_before_peer_close(peer);
close(peer->socket);
return -1;
}
// 儲存該peer的peer_id
memcpy(peer->id,buff+48,20);
(peer->id)[20] = '\0';
// 若當前處於Initial狀態,則發送握手訊息給peer
if(peer->state == INITIAL) {
create_handshake_msg(info_hash,peer_id,peer);
peer->state = HANDSHAKED;
}
// 若握手訊息已發送,則狀態轉換為已握手狀態
if(peer->state == HALFSHAKED) peer->state = HANDSHAKED;
// 記錄最近收到該peer訊息的時間
// 若一定時間內(如兩分鐘)未收到來自該peer的任何訊息,則關閉串連
peer->start_timestamp = time(NULL);
return 0;
}
u l int process_keep_alive_msg(Peer *peer,unsigned char *buff,int len)
功能:處理剛剛接收到的來自peer的keepv_alive訊息。函數實現的代碼如下:
int process_keep_alive_msg(Peer *peer,unsigned char *buff,int len)
{
if(peer==NULL || buff==NULL) return -1;
// 記錄最近收到該peer訊息的時間
// 若一定時間內(如2min)未收到來自該peer的任何訊息,則關閉串連
peer->start_timestamp = time(NULL);
return 0;
}
u l int process_choke_msg(Peer *peer,unsigned char *buff,int len)
功能:處理收到的choke訊息。函數實現的代碼如下:
int process_choke_msg(Peer *peer,unsigned char *buff,int len)
{
if(peer==NULL || buff==NULL) return -1;
// 若原先處於unchoke狀態,收到該訊息後更新peer中某些變數的值
if( peer->state!=CLOSING && peer->peer_choking==0 ) {
peer->peer_choking = 1;
peer->last_down_timestamp = 0; // 將最近接收到來自該peer資料的時間清零
peer->down_count = 0; // 將最近從該peer處下載的位元組數清零
peer->down_rate = 0; // 將最近從該peer下載資料的速度清零
}