求教关于使用winsock api访问网页的奇怪问题
首先贴出源程序
// 网页获取.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include "winsock2.h"
#define RECV_BUFFER_SIZE 8192
#pragma comment(lib, "Ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
// 变量定义
SOCKADDR_IN clientService;// 地址
SOCKET ConnectSocket;// socket
WSADATA wsaData;// 库
LPVOID recvbuf;// 接收缓存
int bytesSent;
int bytesRecv = 0;
//char sendbuf[32] = "GET /99/tips/";// 默认发送的数据
char sendbuf[2048];
for(int j=0;j<2048;j++) sendbuf[j]='\0x0';
//定义http头信息
lstrcpy(sendbuf,"GET / HTTP/1.1\r\n");
lstrcat(sendbuf,"Accept: */*\r\n");
lstrcat(sendbuf,"Accept-Language: zh-cn\r\n");
lstrcat(sendbuf,"Accept-Encoding: gzip, deflate\r\n");
lstrcat(sendbuf,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQPinyin 722; Foxy/1; Foxy/1; .NET CLR 2.0.50727)\r\n");
lstrcat(sendbuf,"Host: 192.168.1.8\r\n");
lstrcat(sendbuf,"Connection: Keep-Alive\r\n");
lstrcat(sendbuf,"Cookie: ASPSESSIONIDCSQBDCQT=EPIDELECFMICBOEJEIAKOOAA\r\n\r\n");
// 初始化socket库, 保存ws2_32.dll已经加载
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
// 创建socket
ConnectSocket = socket(AF_INET, // IPv4
SOCK_STREAM, // 顺序的、可靠的、基于连接的、双向的数据流通信
IPPROTO_TCP// 使用TCP协议
);
if (ConnectSocket == INVALID_SOCKET)
{
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 0;
}
// 设置服务端的通信协议、IP地址、端口
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "192.168.1.8" );
clientService.sin_port = htons( 80 );
// 连接到服务端
if ( connect(
ConnectSocket, // socket
(SOCKADDR*) &clientService, // 地址
sizeof(clientService) // 地址的大小
) == SOCKET_ERROR)
{
printf( "Failed to connect(%d)\n",WSAGetLastError() );
WSACleanup();
return 0;
}
// 准备发送数据
// 如果输入参数是-d,那么发送的数据是“download file”否则是"get information"
if(argc ==2 && (!lstrcmp(argv[1], "-d")))
{
lstrcpyn(sendbuf, "download file", 32);
}
// 向服务端发送数据
bytesSent = send( ConnectSocket, // socket
sendbuf,// 发送的数据
lstrlen(sendbuf)+1,// 数据长度
0 );// 无标志
if(bytesSent == SOCKET_ERROR)
{
printf( "send error (%d)\n", WSAGetLastError());
closesocket(ConnectSocket);
return 0;
}
printf( "Bytes Sent: %ld\n", bytesSent );
// 准备接收数据
recvbuf = HeapAlloc(GetProcessHeap(), 0, RECV_BUFFER_SIZE);
// 循环接收
while( bytesRecv != SOCKET_ERROR )
{
Sleep(50);
bytesRecv = recv( ConnectSocket, // socket
(char *)recvbuf, // 接收数据缓存
RECV_BUFFER_SIZE,// 缓存大小
0 );// 无标志
if ( bytesRecv == 0 )
{
printf( "Connection Closed.\n");
break;
}
// TODO,处理接收的数据,这里只简单的将收到的数据大小显示
printf( "Bytes Recv: %ld\n", bytesRecv );
}
printf("%s",recvbuf);
HeapFree(GetProcessHeap(), 0, recvbuf);
WSACleanup();
return 0;
}
----------------------------------------------------------------
以上就是源程序,发送一个特定的http头来访问192.168.1.8主机上的默认IIS主页index.asp,但是问题来了
发送后,返回的是两部分,一个是正常返回的网页,另一个是失败的请求返回的网页,理论上应该只有一个
后面那个失败返回页面我怎么也想不出来是怎么来的,请各位有经验的大哥帮忙解答下
// 网页获取.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include "winsock2.h"
#define RECV_BUFFER_SIZE 8192
#pragma comment(lib, "Ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
// 变量定义
SOCKADDR_IN clientService;// 地址
SOCKET ConnectSocket;// socket
WSADATA wsaData;// 库
LPVOID recvbuf;// 接收缓存
int bytesSent;
int bytesRecv = 0;
//char sendbuf[32] = "GET /99/tips/";// 默认发送的数据
char sendbuf[2048];
for(int j=0;j<2048;j++) sendbuf[j]='\0x0';
//定义http头信息
lstrcpy(sendbuf,"GET / HTTP/1.1\r\n");
lstrcat(sendbuf,"Accept: */*\r\n");
lstrcat(sendbuf,"Accept-Language: zh-cn\r\n");
lstrcat(sendbuf,"Accept-Encoding: gzip, deflate\r\n");
lstrcat(sendbuf,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQPinyin 722; Foxy/1; Foxy/1; .NET CLR 2.0.50727)\r\n");
lstrcat(sendbuf,"Host: 192.168.1.8\r\n");
lstrcat(sendbuf,"Connection: Keep-Alive\r\n");
lstrcat(sendbuf,"Cookie: ASPSESSIONIDCSQBDCQT=EPIDELECFMICBOEJEIAKOOAA\r\n\r\n");
// 初始化socket库, 保存ws2_32.dll已经加载
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
// 创建socket
ConnectSocket = socket(AF_INET, // IPv4
SOCK_STREAM, // 顺序的、可靠的、基于连接的、双向的数据流通信
IPPROTO_TCP// 使用TCP协议
);
if (ConnectSocket == INVALID_SOCKET)
{
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 0;
}
// 设置服务端的通信协议、IP地址、端口
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "192.168.1.8" );
clientService.sin_port = htons( 80 );
// 连接到服务端
if ( connect(
ConnectSocket, // socket
(SOCKADDR*) &clientService, // 地址
sizeof(clientService) // 地址的大小
) == SOCKET_ERROR)
{
printf( "Failed to connect(%d)\n",WSAGetLastError() );
WSACleanup();
return 0;
}
// 准备发送数据
// 如果输入参数是-d,那么发送的数据是“download file”否则是"get information"
if(argc ==2 && (!lstrcmp(argv[1], "-d")))
{
lstrcpyn(sendbuf, "download file", 32);
}
// 向服务端发送数据
bytesSent = send( ConnectSocket, // socket
sendbuf,// 发送的数据
lstrlen(sendbuf)+1,// 数据长度
0 );// 无标志
if(bytesSent == SOCKET_ERROR)
{
printf( "send error (%d)\n", WSAGetLastError());
closesocket(ConnectSocket);
return 0;
}
printf( "Bytes Sent: %ld\n", bytesSent );
// 准备接收数据
recvbuf = HeapAlloc(GetProcessHeap(), 0, RECV_BUFFER_SIZE);
// 循环接收
while( bytesRecv != SOCKET_ERROR )
{
Sleep(50);
bytesRecv = recv( ConnectSocket, // socket
(char *)recvbuf, // 接收数据缓存
RECV_BUFFER_SIZE,// 缓存大小
0 );// 无标志
if ( bytesRecv == 0 )
{
printf( "Connection Closed.\n");
break;
}
// TODO,处理接收的数据,这里只简单的将收到的数据大小显示
printf( "Bytes Recv: %ld\n", bytesRecv );
}
printf("%s",recvbuf);
HeapFree(GetProcessHeap(), 0, recvbuf);
WSACleanup();
return 0;
}
----------------------------------------------------------------
以上就是源程序,发送一个特定的http头来访问192.168.1.8主机上的默认IIS主页index.asp,但是问题来了
发送后,返回的是两部分,一个是正常返回的网页,另一个是失败的请求返回的网页,理论上应该只有一个
后面那个失败返回页面我怎么也想不出来是怎么来的,请各位有经验的大哥帮忙解答下
...全文
相关推荐
VC++6.0下UDP网络通讯实战:Winsock编程详解
UDP作为无连接的传输层协议,以其低延迟、低开销的特点在实时数据采集与工业控制场景中广泛应用。Winsock是Windows平台下网络编程的标准接口,即便在VC++6.0这样的经典开发环境中,核心Socket API依然稳定可靠。理解UDP的报文发送原理与Winsock的初始化、绑定、收发流程,能帮助开发者快速实现上位机与下位机之间的数据交互。无论是老系统维护、设备调试,还是网络协议学习,掌握基于UDP的Socket编程都具有实用价值。从工程实践来看,VC++6.0下UDP通讯的具体实现需要重点关注Wins
ubuntu22.04安装ebpf所需deb包
ubuntu22.04安装ebpf所需deb包
政府科技管理者如何高效整合区域创新资源并精准配置?.docx
政府科技管理者如何高效整合区域创新资源并精准配置?
基于霍尼韦尔Voyager 1400g系列扫描器
基于霍尼韦尔Voyager 1400g系列扫描器:有线图像扫描设备快速上手与配置指南【自动识别技术】基于Honeywell Voyager 1400g扫描器的多接口配置与条码读取优化:工业级固定式成像扫描设备应用指南
高校技术转移办公室人员如何快速识别与筛选高质量专利?.docx
高校技术转移办公室人员如何快速识别与筛选高质量专利?


网络编程
