2013-01-21 39 views
1

我正在寫一個至少在局域網上用套接字播放的遊戲。我用4個字節長度的前綴,要知道在剩下多少數據是這樣的:靈活的套接字應用程序

void trust_recv(int sock, int length, char *buffer) 
{ 
    int recved = 0; 
    int justRecv; 

    while(recved < length) { 
     justRecv = recv(sock, buffer + recved, length - recved, 0); 
     if (justRecv < 0) return; 

     recved += justRecv; 
    } 
} 

void onDataArrival(int sock) 
{ 
    int length; 
    char *data; 

    trust_recv(sock, 4, (char *) &length); 
    data = new char[length]; 

    trust_recv(sock, length, data); 
    do_somethings_with_data(data); 
} 

的問題是,如果有人(例如入侵者或黑客)發送的數據與其他格式(也許只有2個字節長度其餘的低於4字節的前綴值)或網絡問題,我的應用程序將轉到「無響應」狀態並且必須關閉(因爲我使用了阻塞套接字)。如何使我的套接字應用程序更加靈活,但不要將套接字轉換爲非阻塞模式來傳遞此問題? (或者任何關於組織數據或算法的想法)

+0

'的sizeof(int)的'可能不是'4'。你應該使用'int32_t'和'sizeof(length)'來防止堆棧損壞。 –

+0

@JamesMcLaughlin:謝謝,我會通知 –

回答

0

您可以在套接字設置階段設置接收超時,其中setsockopt()調用和SO_RCVTIMEO參數;

struct timeval tv; 

tv.tv_sec =8; 
tv.tv_usec = 0 ; 

if (setsockopt (your_sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) 
    perror(「setsockopt error」); 

然後測試的recv()回報,他errno

if (justRecv < 0) 
{ 
    if (errno == EAGAIN) 
     perror("TIMEOUT!"); 
    return; 
}  
+0

感謝您的好回答,順便說一句,有沒有其他方法可以解決這個問題? –

相關問題