我正在使用winsock2
在C++中编写套接字程序,我试图使用WSAAccept
来有条件地接受连接。我复制了来自MSDN的示例ConditionalFunction,以获取WSAAccept中的lpfnCondition
参数,如下所示。尝试检索指针的内容时程序崩溃
SOCKET WSAAccept(
_In_ SOCKET s,
_Out_ struct sockaddr *addr,
_Inout_ LPINT addrlen,
_In_ LPCONDITIONPROC lpfnCondition, //<---------
_In_ DWORD_PTR dwCallbackData
);
试图访问在ConditionalFunction
像这样WSABUF buffer = *lpCallerData
我的程序崩溃的lpCallerId
内容然而,当。我知道这是问题的根源,因为当我发表评论时,我的程序不会崩溃。我不认为我的所有代码都是必需的。任何帮助将是可爱的。
编辑:
CALLBACK ConditionalAccept(LPWSABUF lpCallerId,LPWSABUF lpCallerData,LPQOS lpSQOS,
LPQOS lpGQOS,LPWSABUF lpCalleeId,LPWSABUF lpCalleeData,
GROUP *g,DWORD_PTR dwCallbackData)
{
WSABUF buffer = *lpCallerData;
if (lpSQOS != NULL) {
RtlZeroMemory(lpSQOS, sizeof(QOS));
return CF_ACCEPT;
} else
return CF_REJECT;
}
...
WSAAccept(slisten, (SOCKADDR*)&acceptSock, &Size, &ConditionalAccept, NULL);
请尝试创建一个[最小化,完整和可验证示例](http://stackoverflow.com/help/mcve),您可以向我们显示。 –
什么是'lpCallerData'? – immibis
如果您可以阅读有关此参数的MSDN文档:这些参数中的信息与连接请求一起发送。 *如果没有主叫方标识或主叫方数据可用,则相应的参数将为NULL *。 –