2010-11-14 56 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