Web请求没有结果

jiangfeng999 2007-11-16 12:45:24
我用socket向一个web页面发送一个web请求,向获得这个页面的代码,但是结果怎么是空的,我用IE可以打开改网页.
我的代码如下
#include <stdio.h>
#include <memory.h>
#include <winsock.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <windows.h>
#include <string.h>
#include <cstring>
#pragma comment(lib,"wsock32.lib");
using namespace std;

//定义网站结构
typedef struct
{
char url[255]; //完整网址
char host[100]; //主机地址
int port; //sock 联接的端口号
}DOMAIN;

int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);

char send_str[1024*10];
char resc_str[1024*100+1];
int resc_num;
int sock_id; //sock 联接句柄
struct hostent *hostbyname; //主机的信息 结构
struct sockaddr_in remote_addr; //包含远端主机IP地址和端口号的结构

DOMAIN web_domain;
memset(&web_domain,0,sizeof(web_domain));

strcpy(web_domain.url,"http://war.163.com/07/1107/15/3SN323DC00011232.html");
strcpy(web_domain.host,"www.163.com");
web_domain.port=80;

hostbyname=gethostbyname(web_domain.host);
if((sock_id=socket(PF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

remote_addr.sin_family=AF_INET;
remote_addr.sin_port=htons(web_domain.port); //端口号
remote_addr.sin_addr=*((struct in_addr *)hostbyname->h_addr);
//bzero(&(remote_addr.sin_zero),8); //填充0 以保持与struct sockaddr同样大小

connect(sock_id,(struct sockaddr *)&remote_addr,sizeof(remote_addr));

memset(send_str,'\0',sizeof(send_str));

sprintf(send_str,"GET %s HTTP/1.1\r\nAccept: */*\r\nAccept-Language:zh-cn\r\nUser-Agent:Mozilla/4.0 (compatible;MSIE 7.0;Windows XP)\r\nHost:%s",web_domain.url,web_domain.host);
memset(resc_str,'\0',sizeof(resc_str));
send(sock_id,send_str,strlen(send_str),0);

resc_num=recv(sock_id,resc_str,1024*100,0);
printf("%s\n",resc_str);
FILE *fp;
fp=fopen("1.txt","w");
fprintf(fp,"%s",resc_str);
fclose(fp);
}
大家一起看看到底是出了什么问题
...全文
223 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
0黄瓜0 2007-11-18
  • 打赏
  • 举报
回复
对http协议我也陌生得很.大概是必须两个CRLF(即\r\n\r\n)才能标示消息报头结束吧.

我这样试,是因为,前两天刚好看到这句
HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文.消息报头和请求正文之间是用两个(CRLF)分隔的.

0黄瓜0 2007-11-18
  • 打赏
  • 举报
回复
对http协议我也陌生得很.大概是必须两个CRLF(即\r\n\r\n)才能标示消息报头结束吧.

我这样试,是因为,前两天刚好看到这句
HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文.消息报头和请求正文之间是用两个(CRLF)分隔的.

jiangfeng999 2007-11-17
  • 打赏
  • 举报
回复
to:A_B_C_ABC
sprintf(send_str, "GET %s HTTP/1.1\r\nAccept:*/*\r\n"
"Accept-Language:zh-cn\r\n"
"User-Agent:Mozilla/4.0 (compatible;MSIE 7.0;Windows XP)\r\n"
"Host:%s\r\n\r\n",//这里加了\r\n\r\n
web_domain.url,web_domain.host);
send(sock_id,send_str,strlen(send_str),0);
memset(resc_str, '\0',sizeof(resc_str));


问一下web请求的最后为什么要加\r\n\r\n呢
maxx 2007-11-16
  • 打赏
  • 举报
回复
char httpAccept[] = ("Accept: */*\r\n");
char httpAgent[] = ("User-Agent: Mozilla/3.0 (compatible; Indy.Library)\r\n");
char httpConnect[] = ("Connection: Keep-Alive\r\n");

int nRet = 0;

wchar_t httpType[512] = {0};
char httpTypeT[512] = {0};
swprintf(httpType, L"GET %s HTTP/1.1\r\n", m_pServerLocal);

WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, httpType, -1, httpTypeT, sizeof(httpTypeT), NULL, NULL );
nRet = send(CONNSOCKET,(char*)httpTypeT,strlen(httpTypeT),0);
if (nRet <= 0)
{
DWORD err = GetLastError();
return -1;
}

char httpHost[512] = {0};
sprintf(httpHost, "Host: %s\r\n", m_TransNet.GetServerIP());
nRet = send(CONNSOCKET,(char*)httpHost,strlen(httpHost),0);
if (nRet <= 0)
return -1;

nRet = send(CONNSOCKET,(char*)httpAccept,strlen(httpAccept),0);
if (nRet <= 0)
return -1;

nRet = send(CONNSOCKET,(char*)httpAgent,strlen(httpAgent),0);
if (nRet <= 0)
return -1;

nRet = send(CONNSOCKET,(char*)httpConnect,strlen(httpConnect),0);
if (nRet <= 0)
return -1;

char httprn[] = ("\r\n\r\n");
nRet = send(CONNSOCKET,(char*)httprn,4,0);
参照这个吧,我写的,已经经过验证了 哈哈
0黄瓜0 2007-11-16
  • 打赏
  • 举报
回复
修改为这样:

sprintf(send_str, "GET %s HTTP/1.1\r\nAccept:*/*\r\n"
"Accept-Language:zh-cn\r\n"
"User-Agent:Mozilla/4.0 (compatible;MSIE 7.0;Windows XP)\r\n"
"Host:%s\r\n\r\n",//这里加了\r\n\r\n
web_domain.url,web_domain.host);
send(sock_id,send_str,strlen(send_str),0);
memset(resc_str, '\0',sizeof(resc_str));


得到如下结果:

HTTP/1.0 403 Forbidden

Server: cache/2.001+logs

Mime-Version: 1.0

Date: Thu, 15 Nov 2007 18:15:26 GMT

Content-Type: text/html

Content-Length: 1167

Expires: Thu, 15 Nov 2007 18:15:26 GMT

X-Squid-Error: ERR_ACCESS_DENIED 0

X-Cache: MISS from www.163.com

Proxy-Connection: close



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<TITLE>错误:您所请求的网址(URL)无法获取</TITLE>
<STYLE type="text/css"><!--BODY{background-color:#ffffff;font-family:verdana,sans-serif}PRE{font-family:sans-serif}--></STYLE>
</HEAD><BODY>
<H1>错误</H1>
<H2>您所请求的网址(URL)无法获取</H2>
<HR noshade size="1px">
<P>
当尝试读取以下网址(URL)时:
<A HREF="http://war.163.com/07/1107/15/3SN323DC00011232.html">http://war.163.com/07/1107/15/3SN323DC00011232.html</A>
<P>
发生了下列的错误:
<UL>
<LI>
<STRONG>
Access Denied.
<BR>拒绝访问
</STRONG>
<P>
Access control configuration prevents your request from
being allowed at this time. Please contact your service provider if
you feel this is incorrect.
<BR>
当前的存取控制设定禁止您的请求被接受,
如果您觉得这是错误的,请与您网路服务的提供者联系。
</UL>
</P>
<P>本缓存服务器管理员:<A HREF="mailto:webmaster">webmaster</A>


<BR clear="all">
<HR noshade size="1px">
<ADDRESS>
Generated Thu, 15 Nov 2007 18:15:26 GMT by www.163.com (cache/2.001+logs)
</ADDRESS>
</BODY></HTML>


0黄瓜0 2007-11-16
  • 打赏
  • 举报
回复
sprintf(send_str, "GET   %s   HTTP/1.1\r\nAccept:   */*\r\nAccept-Language:zh-cn\r\nUser-Agent:Mozilla/4.0     (compatible;MSIE   7.0;Windows   XP)\r\nHost:%s ",web_domain.url,web_domain.host); 
memset(resc_str, '\0 ',sizeof(resc_str)); ///这句应该在send之后吧.
send(sock_id,send_str,strlen(send_str),0);

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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