线程和结构通信

Chi*_*eno 0 c++ networking multithreading

我正在做一个项目,要求我接收来自许多发件人的消息.我的recv服务器使用线程recv在UDP协议下连续数据.我struct BufferData在头文件中调用了一个结构来组织我从客户端收到的缓冲区.这是我的struct样子:

struct BufferData
{
    char Buffer1[BYTES];
    char Buffer2[BYTES];
    char Buffer3[BYTES];
    char MixedBuffer1[BYTES];
    char MixedBuffer2[BYTES];
    char MixedBuffer3[BYTES];
};
Run Code Online (Sandbox Code Playgroud)

这是我在.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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不知道将RecvBuf中包含的值传递给我的BufferData结构,因为这个线程和我不能直接使用.请帮忙.

谢谢.

tem*_*def 5

当你_beginthreadex通过电话打电话

_beginthreadex(NULL, 0, &CUdpSocket::ServerRecvThread, pRecvData, 0, &threadID);
Run Code Online (Sandbox Code Playgroud)

函数(pRecvData)的第四个参数作为void*参数传递给CUdpSocket::ServerRecvThread函数.更一般地说,如果需要将信息传递给该函数,可以将它作为最终参数传递给该函数.

如果您希望能够获取收到的数据并将其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 ... */
}
Run Code Online (Sandbox Code Playgroud)

当然,这是非常危险的,因为这意味着当线程开始接收数据时,它将使用最新数据覆盖缓冲区的内容.因此,我建议改为维护某种同步队列,其中包含到目前为止收到的所有数据包的列表.如果你这样做了,那么你的线程可以接受指向该同步队列的指针,BufferData在接收数据时创建自己的对象,然后将它们复制到队列中.然后,程序的其余部分可以通过阻塞处理它接收的数据,直到队列中包含一些数据,然后从该队列中读取数据.

另外,在一个完全不相关的注释上,不要goto用来创建一个处理recvfrom调用的循环.使用while (true)循环代替...它更具可读性.

希望这可以帮助!