2011-03-19 23 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