1

MicrosoftプラットフォームSDKで提供されるサンプルLSPのWSPSend関数で宛先ポート番号を取得する際に問題が発生します。

これが私が使用しているコードです。以下に示すように、ifステートメントは入力されていません。デバッグ機能を使ってこれを確認しました。

宛先ポート80を使用して、この関数内の送信HTTPパケットを認識しようとしています。

int WSPAPI 
WSPSend(
    SOCKET          s,
    LPWSABUF        lpBuffers,
    DWORD           dwBufferCount,
    LPDWORD         lpNumberOfBytesSent,
    DWORD           dwFlags,
    LPWSAOVERLAPPED lpOverlapped,                             
    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,   
    LPWSATHREADID   lpThreadId,                                 
    LPINT           lpErrno                                             
    )
{
    INT                 ret = SOCKET_ERROR;
    SOCK_INFO          *SocketContext = NULL;
    LPWSAOVERLAPPEDPLUS ProviderOverlapped = NULL;

    *lpErrno = NO_ERROR;

    //
    // Find our provider socket corresponding to this one
    //
    SocketContext = FindAndRefSocketContext(s, lpErrno);
    if ( NULL == SocketContext )
    {
        dbgprint( "WSPSend: FindAndRefSocketContext failed!" );
        goto cleanup;
    }

    // My code starts here!!!
    SOCKET app = SocketContext->LayeredSocket;
    struct sockaddr FAR name;
    int FAR namelen;
    getpeername(app, &name, &namelen);
    struct sockaddr_in sin;
    sin =* (const struct sockaddr_in *) (&name);
    if(sin.sin_port == htons(80))
    {
        // This code is not executed after sending HTTP packets!!
    }
 }

何か案が?

4

1 に答える 1

2

getpeernameは機能しましたか?結果を使用する前に、コードで戻りコードを確認する必要があります。

エラーが発生しない場合、getpeernameはゼロを返します。それ以外の場合は、SOCKET_ERRORの値が返され、WSAGetLastErrorを呼び出すことで特定のエラーコードを取得できます。

それはさておき、この呼び出しを行う前に、出力構造のサイズを指定する必要があります。これは、初期化されていないnamelenため、ここで何が間違っているかについての私の賭けです。WinSockのドキュメントnamelenを注意深く読むことが重要です。WindowsにはこれらのAPI使用規則がたくさんあり、従わないと多くの時間を浪費する可能性があります。

呼び出し時に、namelenパラメーターには、名前バッファーのサイズ(バイト単位)が含まれます。返されるとき、namelenパラメーターには、返されるnameパラメーターの実際のサイズ(バイト単位)が含まれます。

于 2010-11-14T13:29:46.473 に答える