【发布时间】:2017-03-10 11:47:19
【问题描述】:
情况
直到昨天,我的线程代码工作正常。但现在,我的线程参数在传递到线程时被归零和移动。
main.cpp
中的相关代码//First socket: UDP | Second Socket: TCP
std::pair<SOCKET, SOCKET> ServerSockets = Network::Operations::Server();
SOCKET UDPSocket = ServerSockets.first;
//Need to pass two arguments to the thread, when it only accepts one pointer. So create a struct and send the pointer.
ListenData UDPServ;
UDPServ.pNetwork = &Network;
UDPServ.LocalUDPSocket = UDPSocket;
//Set up the listener.
HANDLE UDPListener = Network::Operations::UDPListen(UDPServ);
在这个阶段UDPSocket是正确的值(例如103),pNetwork也是正确的。
UDPListen()中的相关代码
static HANDLE UDPListen(ListenData UDPListenData)
{
HANDLE NetworkThread;
NetworkThread = CreateThread(
NULL, //Default security
0, //Default thread stack size
Network::Operations::Listen, //Thread function name
&UDPListenData, //Thread arguments
0, //Default creation flags
NULL);
//CloseHandle(NetworkThread);
return NetworkThread;
}
在此状态下,值应为应有的值。
Listen()中的相关代码
static DWORD WINAPI Listen(void *param)
{
ListenData *UDPServ = (ListenData*)param;
SOCKET Socket = UDPServ->LocalUDPSocket;
std::vector<Net> *Network = UDPServ->pNetwork;
然而,现在UDPSocket 为零,pNetwork 为 103。这是个谜。
我真正改变的唯一代码是初始化服务器的代码,我对其进行了修改以结合绑定 TCP 套接字。该函数用于返回单个SOCKET,但现在返回std::pair<SOCKET, SOCKET>。
【问题讨论】:
-
我怀疑您应该通过引用传递
UDPListenData:static HANDLE UDPListen(ListenData& UDPListenData)。目前您似乎正在获取按值传递的临时参数的地址:&UDPListenData
标签: c++ multithreading sockets winapi