我在使用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!!
}
}
有什么想法吗?
答案 0 :(得分:2)
getpeername有效吗?在使用结果之前,您的代码需要检查返回代码。
如果没有错误发生,请使用getpeername 返回零。否则,值为 返回SOCKET_ERROR,并且a 可以检索特定的错误代码 通过调用WSAGetLastError。
除此之外,您需要在进行此调用之前将namelen
指定为输出结构的大小 - 这是我对此处出错的赌注,因为namelen
未初始化。仔细阅读WinSock documentation非常重要 - Windows充斥着这些API使用规则,如果您不遵守它们,可能会浪费大量时间。
随叫随到,namelen参数 包含的大小(以字节为单位) 名称缓冲区。返回时,namelen 参数包含实际大小 返回的name参数的字节数。