2010-11-14 58 views
1

我在使用Microsoft Platform SDK提供的示例LSP中的WSPSend函数中获取目标端口号时遇到问题。在WSPSend中获取目标端口

这是我正在使用的代码。如下所示,不输入if语句。我使用调试功能对此进行了验证。

我试图使用目的端口80

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

任何想法,认识到这一点函数内部传出HTTP数据包?

回答

2

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

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

这且不说,您需要进行此调用之前指定namelen是你的输出结构的大小 - 这是我对这里有什么问题,因为namelen未初始化的赌注。仔细阅读WinSock documentation非常重要--Windows充斥着这些API使用规则,如果不遵循这些规则,则可能浪费大量时间。

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

+0

我检查了getpeername的返回值。它没有返回0! – Khaled 2010-11-14 13:48:09

+0

@Khaled - 这是有用的信息 - 将'namelen'设置为'sizeof(struct sockaddr)',这应该会更好。 – 2010-11-14 14:02:03

+0

非常感谢。它现在有效。 – Khaled 2010-11-14 14:10:57