2011-03-19 26 views
0

我正在做一個項目,需要我接收來自多個發件人的消息。我的recv服務器正在使用一個線程來連續使用UDP協議下的數據recv。我在頭文件中有一個名爲struct BufferData的結構來組織從客戶端接收到的緩衝區。這是我struct的樣子:線程和結構體通信

struct BufferData 
{ 
    char Buffer1[BYTES]; 
    char Buffer2[BYTES]; 
    char Buffer3[BYTES]; 
    char MixedBuffer1[BYTES]; 
    char MixedBuffer2[BYTES]; 
    char MixedBuffer3[BYTES]; 
}; 

這裏是在.cpp文件我的recv線程功能。

hThread = (HANDLE)_beginthreadex(NULL, 0, &CUdpSocket::ServerRecvThread, pRecvData, 0, &threadID); // Thread caller 

unsigned __stdcall CUdpSocket::ServerRecvThread(void *threadArg) 
{ 
    //----------------------------------------------- 
    // Initialize Winsock 
    //----------------------------------------------- 
    // Create a receiver socket to receive datagrams 
    //----------------------------------------------- 
    // Bind the socket to any address and the specified port. 
    //----------------------------------------------- 
    // Call the recvfrom function to receive datagrams 
    // on the bound socket. 

    start: 
     recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize); 
    goto start; 

    //----------------------------------------------- 
    // Close the socket when finished receiving datagrams 
    //----------------------------------------------- 
    // Clean up and exit. 

    return 0; 
} 

不過,我不知道豪包含在RecvBuf價值傳遞到我的BufferData結構,因爲這是一個線程,我不能用直接的方式。請幫忙。

謝謝。

回答

5

當通過調用

_beginthreadex(NULL, 0, &CUdpSocket::ServerRecvThread, pRecvData, 0, &threadID); 

第四個參數給這個函數(pRecvData)作爲void*參數到CUdpSocket::ServerRecvThread函數傳遞調用_beginthreadex。更一般地說,如果您需要將信息傳遞到該函數中,您可以通過將該信息作爲該函數的最終參數傳遞給它。

如果您希望能夠獲取收到的數據並將其傳送到BufferData對象中,請考慮將指向BufferData對象的指針作爲參數傳遞給該線程。這樣一來,你的接收功能的裏面,你可以做這樣的事情:

unsigned __stdcall CUdpSocket::ServerRecvThread(void *threadArg) 
{ 
    /* ... setup ... */ 

     // Convert the argument to what it really is - a pointer to the buffer. 
    BufferData* data = static_cast<BufferData*>(threadArg); 

    start: 
     recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize); 
     /* ... code to convert the receive buffer data into a data object... */ 
    goto start; 

    /* ... cleanup ... */ 
} 

當然,這是非常危險的,因爲這意味着作爲線程開始接收數據,它將覆蓋的內容用最新的數據緩衝。因此,我建議保持某種同步隊列,其中包含目前爲止收到的所有數據包的列表。如果你這樣做了,那麼你的線程可以接受一個指向該同步隊列的指針,每當它接收到數據時就創建它自己的BufferData對象,然後將它們複製到隊列中。其餘的程序可以通過阻塞來處理它接收到的數據,直到隊列中有數據,然後從該隊列中讀取數據。

此外,在完全不相關的說明中,請勿使用goto來創建處理recvfrom調用的循環。改爲使用while (true)循環...更具可讀性。

希望這會有所幫助!

+0

謝謝!這真的幫助我。 – 2011-03-20 06:57:55

+0

+1不使用goto – 2011-03-20 13:41:36