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

中年CodeBoy 2010-03-09 12:01:56
首先贴出源程序

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

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

后面那个失败返回页面我怎么也想不出来是怎么来的,请各位有经验的大哥帮忙解答下
...全文
115 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-05-17
  • 打赏
  • 举报
回复
结贴通知:
请lz注意结贴。。。。
中年CodeBoy 2010-03-09
  • 打赏
  • 举报
回复
奇怪了哦,用IE浏览器截包不会错哦
hurryboylqs 2010-03-09
  • 打赏
  • 举报
回复
是你IIS的问题吧
可以试其他网页
中年CodeBoy 2010-03-09
  • 打赏
  • 举报
回复
引用楼上的修改后,返回数据还是两部分,一个是正常的返回,一个是错误请求的返回
wwgddx 2010-03-09
  • 打赏
  • 举报
回复
楼上的是网络编程高手!````
hurryboylqs 2010-03-09
  • 打赏
  • 举报
回复
接收回应时怎么是这么写的呢?
int nTotal=0;
// 循环接收
while( bytesRecv != SOCKET_ERROR )
{
Sleep(50);
bytesRecv = recv( ConnectSocket, // socket
(char *)recvbuf+nTotal, // 接收数据缓存
RECV_BUFFER_SIZE,// 缓存大小
0 );// 无标志
if ( bytesRecv == 0 )
{
printf( "Connection Closed.\n");
break;
}
nTotal+=bytesRecv;
// TODO,处理接收的数据,这里只简单的将收到的数据大小显示
printf( "Bytes Recv: %ld\n", bytesRecv );
}

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧