首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

socket实现http,该怎么处理

2012-02-12 
socket实现http大家好,我写了一个程序:C/C++ code#include stdafx.h#include iostream#include strin

socket实现http
大家好,我写了一个程序:

C/C++ code
#include "stdafx.h"#include <iostream>#include <string>#include <ace/ACE.h>#include <ace/INET_Addr.h>#include <ace/SOCK_Connector.h>#include <ace/SOCK_Stream.h>#pragma comment(lib, "ace.lib")#pragma comment(lib, "aced.lib")int _tmain(int argc, _TCHAR* argv[]){    ACE::init();    std::string str = "GET / HTTP/1.1 \r\n"                      "Host: www.163.com \r\n"                      "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0 \r\n"                      "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 \r\n"                      "Accept-Language: zh-cn,zh;q=0.5 \r\n"                      "Accept-Encoding: gzip, deflate \r\n"                      "Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 \r\n"                      "Connection: keep-alive \r\n\r\n";    ACE_INET_Addr svr_addr(80, "www.163.com");    ACE_SOCK_STREAM stream;    ACE_SOCK_Connector connector;    int ret=connector.connect(stream, svr_addr);    if(0 != ret)    {        std::cout<<"Error in connect"<<std::endl;        return -1;    }    std::cout<<"sending data:"<<std::endl<<str<<std::endl;    ret=stream.send(str.c_str(), str.length());    if(-1 == ret)    {        std::cout<<"Error in send"<<std::endl;        return -1;    }    str.erase();    str.resize(1024);    ret=stream.recv((void *)str.c_str(), str.length());    if(-1 == ret)    {        std::cout<<"Error in recv"<<std::endl;        return -1;    }    std::cout<<"recived data::"<<std::endl<<str<<std::endl;    ACE::fini();    return 0;}


但是为什么服务器返回给我的是错误:
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>

请大家解答一下。谢谢!

[解决办法]
应该是语法错了。具体哪句错了,对着http标准查吧。
[解决办法]
某些web站点可以
recived data::
HTTP/1.1 200 OK
Date: Mon, 21 Nov 2011 09:21:53 GMT
Server: Apache/2.2.3 (Win32) DAV/2 mod_ssl/2.2.3 OpenSSL/0.9.8d mod_autoindex_color PHP/5.2.0
X-Powered-By: PHP/5.2.0
Set-Cookie: PHPSESSID=b4a403fb180a040c577cb05713d8d1a1; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: lang=zh_CN; expires=Wed, 21-Dec-2011 09:21:53 GMT; path=/
Content-Language: zh
Content-Length: 4067
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
X-RBT-Optimized-By: CNZGJWAVRGY001 (RiOS 6.1.4) SC

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh" lang="zh">
<head>
<title>
[解决办法]
还是通过wireshark抓包来做比较靠谱
[解决办法]

要指明访问那个页面吧
------解决方案--------------------


"GET / HTTP/1.1空格\r\n"
把每行\r\n前的空格去了。

另外
Accept-Encoding: gzip, deflate
你告诉服务器接受gzip编码,返回的可能就是gzip编码,cout输出就是乱码

ret=stream.recv((void *)str.c_str(), str.length());
去看下string的c_str是什么,能这么用么?

访问163主页,返回的数据量是很大的。
[解决办法]
Request-Line =Method SP Request-URL SP HTTP-Version CRLF

CRLF前直接是HTTP-Version,没有空格(SP)
[解决办法]
服务器走的是1.0协议 比客户端低。
请求Connection: keep-alive属性去除,修改请求协议为1.0看看
[解决办法]
没那么麻烦吧,就
"GET / HTTP/1.1\r\nHost: www.163.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0 \r\n...

一个串(空格没,TOP6),建个连接发送过去,经常弄这,现在163那通常在100多K(不压缩的),如果实在还有问题,加入我新弄的QQ群:182181974再聊

热点排行