【问题标题】:Get destination port in WSPSend在 WSPSend 中获取目标端口
【发布时间】:2010-11-14 12:09:34
【问题描述】:

我在 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!!
    }
 }

有什么想法吗?

【问题讨论】:

    标签: windows visual-c++ networking winsock winsock-lsp


    【解决方案1】:

    getpeername 工作了吗?您的代码需要在使用结果之前检查返回码。

    如果没有错误发生,getpeername 返回零。否则,值为 SOCKET_ERROR 被返回,并且一个 可以检索特定的错误代码 通过调用 WSAGetLastError。

    除此之外,在进行此调用之前,您需要将 namelen 指定为输出结构的大小 - 这是我对这里出了什么问题的赌注,因为 namelen 未初始化。仔细阅读WinSock documentation 很重要 - Windows 中充斥着这些 API 使用规则,如果您不遵守这些规则,您可能会浪费很多时间。

    随叫随到,namelen 参数 包含大小(以字节为单位)的 名称缓冲区。返回时,namelen 参数包含实际大小,在 返回的 name 参数的字节数。

    【讨论】:

    • 我检查了getpeername的返回值。它没有返回 0!
    • @Khaled - 这是有用的信息 - 将 namelen 设置为 sizeof(struct sockaddr),这应该会更好。
    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多