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在进行此调用之前指定输出结构的大小 - 这是我对这里错误的赌注,因为namelen没有初始化。仔细阅读WinSock 文档很重要——Windows 充斥着这些 API 使用规则,如果你不遵守它们,你可能会浪费很多时间。

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

于 2010-11-14T13:29:46.473 回答