2016-06-13 15 views
-2

私はwinsock2を使用してC++でソケットプログラムを作成していますが、WSAAcceptを使用して接続を条件付きで受け入れようとしています。以下に示すようにWSDNAceptのlpfnCondition引数のMSDNからConditionalFunctionという例をコピーしました。 ConditionalFunctionWSABUF 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); 
+3

私たちに見せることができる[最小限で完全であり、検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –

+0

'lpCallerData'とは何ですか? – immibis

+2

このパラメータに関するMSDNドキュメントを読むことができる場合:これらのパラメータの情報が接続要求とともに送信されます。 *発信者識別情報または発信者データがない場合、対応するパラメータはNULL *になります。 –

答えて

3

、あなたはそれを逆参照する前にNULLのためlpCallerDataをチェックされていません。それがあなたのコードがクラッシュする理由です。

int CALLBACK ConditionalAccept(LPWSABUF lpCallerId,LPWSABUF lpCallerData,LPQOS lpSQOS, 
          LPQOS lpGQOS,LPWSABUF lpCalleeId,LPWSABUF lpCalleeData, 
          GROUP *g,DWORD_PTR dwCallbackData) 
{ 
    WSABUF buffer = {0}; 

    if (lpCallerData != NULL) { // <-- add this check! 
     buffer = *lpCallerData; 
    } 

    if (lpSQOS != NULL) { 
     RtlZeroMemory(lpSQOS, sizeof(QOS)); 
     return CF_ACCEPT; 
    } else 
     return CF_REJECT; 
} 

しかし、lpCallerDataは、TCP/IPで無意味であると常に NULLになります。 TCP/IPは、接続確立時に発信者/着信者データの交換をサポートしていません。これは明らかにWSAConnect()ドキュメントに記載されている:

lpCallerDataパラメータは、(接続データと呼ばれる)接続要求とともに送信されるユーザデータへのポインタを含みます。これは、通常のネットワークデータストリームではなく、接続を確立するためのネットワーク要求とともに送信される追加データです。このオプションは、DECNet、OSI TP4などの従来のプロトコルで使用されます。

注意WindowsのTCP/IPプロトコルでは、接続データはサポートされていません。接続データは、RAWソケットを介してATM(RAWWAN)でのみサポートされています。

関連する問題