Получить порт назначения в WSPSend
У меня проблема с получением номера порта назначения в функции 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 ответ
Сработало ли getpeername? Ваш код должен проверить код возврата, прежде чем использовать результаты.
Если ошибки не возникает, getpeername возвращает ноль. В противном случае возвращается значение SOCKET_ERROR, и конкретный код ошибки можно получить, вызвав WSAGetLastError.
Что в сторону, вам нужно указать namelen
быть размером вашей выходной структуры перед этим вызовом - вот моя ставка на то, что здесь не так, так как namelen
не инициализируется. Важно внимательно прочитать документацию по WinSock - Windows пронизана этими правилами использования API, и вы можете потратить много времени, если не будете их соблюдать.
При вызове параметр namelen содержит размер буфера имени в байтах. По возвращении параметр namelen содержит фактический размер возвращаемого параметра name в байтах.