C语言如何用socket发送http请求 得到数据包?

小魔菇 2009-07-15 09:22:08
C语言如何用socket发送http请求 得到数据包?
有源码例子最好了
...全文
2728 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctroll 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 eclipse_2 的回复:]
引用 12 楼 lemirymoo 的回复:
你可以把
GET / HTTP/1.1\r\n\r\n
发送给http://www.baidu.com/

会得到类似下面的东西,上面的是请求头,下面的是内容。Http响应数据包可能会分多次发回来,所以不要只看一个数据包。

HTTP/1.1 200 OK
Date: Wed, 15 Jul 2009 02:56:45 GMT
Ser……
[/Quote]

循环取。
char dest[1000];
nRet=1;
while(nRet>0)
{
nRet=recv(hsocket,(LPSTR)dest,sizeof(dest),0);
if(nRet>0)
dest[nRet]=0;
else
dest[0]=0;
printf("\nReceived bytes:%d\n",nRet);
printf("Result:\n%s",dest);
}
renxiaowen 2010-07-15
  • 打赏
  • 举报
回复
楼主好。。我最近也在研究类似的问题,我想加你QQ好友请教你一下。。。麻烦你了
小魔菇 2009-11-26
  • 打赏
  • 举报
回复
加我Q
312134065
deping_lin 2009-11-26
  • 打赏
  • 举报
回复
楼主你好,我最近也在学socket发送http的请求。能不能把你的代码给我学习一下呢?
lemirymoo 2009-10-26
  • 打赏
  • 举报
回复
Content-Length 中的数字就是正文长度,从\r\n\r\n 后面开始量这么多个长度就是数据末尾了。
小魔菇 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lemirymoo 的回复:]
你可以把
GET / HTTP/1.1\r\n\r\n
发送给http://www.baidu.com/

会得到类似下面的东西,上面的是请求头,下面的是内容。Http响应数据包可能会分多次发回来,所以不要只看一个数据包。

HTTP/1.1 200 OK
Date: Wed, 15 Jul 2009 02:56:45 GMT
Server: BWS/1.0
Content-Length: 3397
Content-Type: text/html
Cache-Control: private
Expires: Wed, 15 Jul 2009 02:56:45 GMT
Set-Cookie: BAIDUID=976BA6BFA22EB89BB…
[/Quote]
如何判断从服务端的数据接收完成了呢?
小魔菇 2009-07-15
  • 打赏
  • 举报
回复
是我错了
程序有问题
已经找出来了
lemirymoo 2009-07-15
  • 打赏
  • 举报
回复
你可以把
GET / HTTP/1.1\r\n\r\n
发送给http://www.baidu.com/

会得到类似下面的东西,上面的是请求头,下面的是内容。Http响应数据包可能会分多次发回来,所以不要只看一个数据包。

HTTP/1.1 200 OK
Date: Wed, 15 Jul 2009 02:56:45 GMT
Server: BWS/1.0
Content-Length: 3397
Content-Type: text/html
Cache-Control: private
Expires: Wed, 15 Jul 2009 02:56:45 GMT
Set-Cookie: BAIDUID=976BA6BFA22EB89BB49FEC0552EE7636:FG=1; expires=Wed, 15-Jul-3
9 02:56:45 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "

<html><head><meta http-equiv=Content-Type content="text/html;charset=gb2312"><ti
tle>百度一下,你就知道 </title><style>body{margin:4px 0}p{margin:0;padding:
0}img{border:0}td,p,#u{font-size:12px}#b,#u,#l td,a{font-family:arial}#kw{font:1
6px Verdana;height:1.78em;padding-top:2px}#b{height:30px;padding-top:4px}#b,#b a
{color:#77c}#u{padding-right:10px;line-height:19px;text-align:right;margin:0 0 3
px !important;margin:0 0 10px}#sb{height:2em;width:5.6em}#km{height:50px}#l{marg
in:0 0 5px 15px}#l td{padding-left:107px}p,table{width:650px;border:0}#l td,#sb,
#km{font-size:14px}#l a,#l b{margin-right:1.14em}a{color:#00c}a:active{color:#f6
0}#hp{position:absolute;margin-left:6px}#lg{margin:-26px 0 -44px}#lk{width:auto;
line-height:18px;vertical-align:top}form{position:relative;z-index:9}</style></h
小魔菇 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lemirymoo 的回复:]
才看明白你要的是客户端,
那你就发
GET [URL] HTTP/1.1\r\n\r\n

有这一行就足够了 。
[/Quote]
只能得到数据头
正文得不到
小魔菇 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lemirymoo 的回复:]
下面代码能够演示出大概意思。你用socket把buff送回客户端就成了。

char *head = "HTTP/1.1 200 OK\r\nContent-Length: %u\r\n\r\n%s";
char *p = " <html> <head> <title>标题 </title> </head> <body>正文 </body> </html>";

char buff[4096];

sprintf(buff,head,strlen(p),p);
[/Quote]
我是从一个客户端向一个网站发送http请求的
服务端我操作不了哈
lemirymoo 2009-07-15
  • 打赏
  • 举报
回复
才看明白你要的是客户端,
那你就发
GET [URL] HTTP/1.1\r\n\r\n

有这一行就足够了 。
小魔菇 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lemirymoo 的回复:]
找个rfc2616按那里面说的发消息就成了。

我用MinGW做过Http服务器,并且实现了C语言做动态网页,虽然很简陋,但毕竟是实现了。

做Http服务器端程序,只要有rfc2616就足够了。

其中请求头中最重要的是第一行  GET [URL] HTTP/1.1\r\n
响应头最重要的是响应代码和正文长度。

如果你只是很简单地做,那我推荐你这样写响应头

HTTP/1.1 200 OK\r\n
Content-Length:[正文长度]\r\n\r\n
[正文]

其中的正文长度就是…
[/Quote]
我是用一个抓包工具 按照上面的格式写的
可以得到数据 不过只能收到数据头部信息
其他的正文信息收不到
lemirymoo 2009-07-15
  • 打赏
  • 举报
回复
下面代码能够演示出大概意思。你用socket把buff送回客户端就成了。

char *head = "HTTP/1.1 200 OK\r\nContent-Length: %u\r\n\r\n%s";
char *p = "<html><head><title>标题</title></head><body>正文</body></html>";

char buff[4096];

sprintf(buff,head,strlen(p),p);
lemirymoo 2009-07-15
  • 打赏
  • 举报
回复
找个rfc2616按那里面说的发消息就成了。

我用MinGW做过Http服务器,并且实现了C语言做动态网页,虽然很简陋,但毕竟是实现了。

做Http服务器端程序,只要有rfc2616就足够了。

其中请求头中最重要的是第一行 GET [URL] HTTP/1.1\r\n
响应头最重要的是响应代码和正文长度。

如果你只是很简单地做,那我推荐你这样写响应头

HTTP/1.1 200 OK\r\n
Content-Length:[正文长度]\r\n\r\n
[正文]

其中的正文长度就是从[正文]部分的长度,其中不包括请求头。
HTTP协议规定,请求头中的换行符是\r\n而不是\n这一点要注意。

一般来说这样写的请求头就能够正常浏览了。
小魔菇 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 NKLoveRene 的回复:]
找个抓包工具抓一下数据包
看http头是怎么组成的
然后照着自己写个字符串,用socket发出去,然后再收一下,就得到数据包了
[/Quote]
为什么我只能得到数据包的头部
其他的数据得不到?
NKLoveRene 2009-07-15
  • 打赏
  • 举报
回复
找个抓包工具抓一下数据包
看http头是怎么组成的
然后照着自己写个字符串,用socket发出去,然后再收一下,就得到数据包了
icefairy 2009-07-15
  • 打赏
  • 举报
回复
mark
Nio96 2009-07-15
  • 打赏
  • 举报
回复
有人讲过。。。

http://blog.csdn.net/wbczyh/archive/2008/02/24/2117094.aspx
SIJIMO 2009-07-15
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090217/15/4a5878d8-5019-4be0-b5c2-b6977a38dcd7.html

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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