求教关于使用winsock api访问网页的奇怪问题

中年CodeBoy 中年CodeBoy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
首先贴出源程序

// 网页获取.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,但是问题来了

发送后,返回的是两部分,一个是正常返回的网页,另一个是失败的请求返回的网页,理论上应该只有一个

后面那个失败返回页面我怎么也想不出来是怎么来的,请各位有经验的大哥帮忙解答下
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
中年CodeBoy
网络编程 18,356 成员 64,161 内容