Получить порт назначения в WSPSend - PullRequest
1 голос
/ 14 ноября 2010

У меня проблема с получением номера порта назначения в функции WSPSend в примере LSP, поставляемом с Microsoft SDK платформы.

Вот код, который я использую. Как показано ниже, оператор if не введен. Я проверил это с помощью функции отладки.

Я пытаюсь распознать исходящие HTTP-пакеты внутри этой функции, используя порт назначения 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!!
    }
 }

Есть идеи?

1 Ответ

2 голосов
/ 14 ноября 2010

Работает ли getpeername ?Ваш код должен проверить код возврата перед использованием результатов.

Если ошибки не возникает, getpeername возвращает ноль.В противном случае возвращается значение SOCKET_ERROR, и конкретный код ошибки можно получить, вызвав WSAGetLastError.

Кроме того, вам необходимо указать namelen в качестве размера выходной структуры перед выполнениемэтот вызов - это моя ставка на то, что здесь не так, поскольку namelen не инициализируется.Важно внимательно прочитать документацию WinSock - Windows пронизана этими правилами использования API, и вы можете потратить много времени, если не будете их соблюдать.

Вкл.вызов, параметр namelen содержит размер, в байтах, буфера имени.По возвращении параметр namelen содержит фактический размер возвращаемого параметра name в байтах.

...