问题描述
我有一个客户端(使用 winhttp 库用 C++ 编写)并连接到 Http(s) 服务器。服务器从默认的 80 端口响应,服务器发送一个带有 307 状态代码的临时重定向消息,告诉客户端使用某个重定向端口。 Winhttp 套接字(在客户端)然后自动使用 443 端口进行通信。(我可以在wireshark 日志中看到通信)我试图在此处导出重定向的端口号(443)并希望使用此 443 端口进一步通信/通信那个服务器。 我的问题是
- winhttp(client socket) 如何自动知道使用/通信到重定向的端口 443 端口,因为服务器没有提到使用这个端口(从wireshark 日志中看到)
- 如何使用 winhttp api 以编程方式捕获新的重定向端口号:
我试过:
设置重定向回调:
WINHTTP_STATUS_CALLBACK setCallback = WinHttpSetStatusCallback(hRequest,WinhttpRedirectCallback,
WINHTTP_CALLBACK_FLAG_REDIRECT,
(DWORD_PTR)NULL);
一旦我收到响应 WinHttpReceiveResponse() 和 winhttp 处理重定向并使用 443 端口,回调 WinhttpRedirectCallback() 被调用。在回调中,我尝试使用 WinHttpQueryHeaders() 检索端口(443)信息并使用 WINHTTP_QUERY_HOST 选项查询,这会导致垃圾信息,并且还使用 WINHTTP_OPTION_CONNECTION_INFO 查询不返回端口的 IP 信息和其他数字
void CALLBACK WinhttpRedirectCallback(
IN HINTERNET hInternet,IN DWORD_PTR dwContext,IN DWORD dwInternetStatus,IN LPVOID lpvstatusinformation,IN DWORD dwStatusinformationLength [![debugScreenshotowithRuntimeValues][1]][1]
)
{
if (WINHTTP_CALLBACK_FLAG_REDIRECT == dwInternetStatus)
{
DWORD* pStatusInfovalue = lpvstatusinformation;
wchar_t hostPort[16];
DWORD hpSize = sizeof(hostPort);
DWORD hpContentSize = sizeof(hostPort);
BOOL bRetVal = WinHttpQueryHeaders(hInternet,WINHTTP_QUERY_HOST,WINHTTP_HEADER_NAME_BY_INDEX,&hostPort,&hpContentSize,WINHTTP_NO_HEADER_INDEX);
....
WINHTTP_CONNECTION_INFO ConnInfo;
DWORD dwConnInfoSize = sizeof(WINHTTP_CONNECTION_INFO);
BOOL bRetVal = WinHttpQueryHeaders( hInternet,WINHTTP_OPTION_CONNECTION_INFO,&ConnInfo,&dwConnInfoSize))
if( bRetVal == TRUE) {
struct sockaddr_in* sin = (struct sockaddr_in*)(&ConnInfo.LocalAddress);
unsigned char* ip = (unsigned char*)&sin->sin_addr.s_addr;
uint16_t m_Port = sin->sin_port;
struct sockaddr_in* sin2 = (struct sockaddr_in*)(&ConnInfo.RemoteAddress);
unsigned char* ip2 = (unsigned char*)&sin2->sin_addr.s_addr;
uint16_t m_Port2 = sin2->sin_port;
}
[1]: https://i.stack.imgur.com/tb418.png
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)