私はwinsock2
を使用してC++でソケットプログラムを作成していますが、WSAAccept
を使用して接続を条件付きで受け入れようとしています。以下に示すようにWSDNAceptのlpfnCondition
引数のMSDNからConditionalFunctionという例をコピーしました。 ConditionalFunction
WSABUF buffer = *lpCallerData
そのように私のプログラムがクラッシュにlpCallerId
の内容にアクセスしようとしているがポインタの内容を取得しようとするとプログラムがクラッシュする
SOCKET WSAAccept(
_In_ SOCKET s,
_Out_ struct sockaddr *addr,
_Inout_ LPINT addrlen,
_In_ LPCONDITIONPROC lpfnCondition, //<---------
_In_ DWORD_PTR dwCallbackData
);
。私はこの問題の原因であることを知っています。なぜなら、私のプログラムをコメントアウトすると、私のプログラムはクラッシュしないからです。私はすべてのコードが必要とは思わない。どんな助けも素敵でしょう。
EDIT:ルークが述べたように
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 *になります。 –