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

sock访问网站?该如何处理

2012-10-19 
sock访问网站?一个网络地址可能对应着多个网站 ,我们访问这个网络地址的时候是通过主机头来分别我们要去的

sock访问网站?
一个网络地址可能对应着多个网站 ,我们访问这个网络地址的时候是通过主机头来分别我们要去的网站
我用socket访问网站,在哪里加入主机头,怎么加入?
下面是我的代码 :请指教

C/C++ code
#include<iostream>#include<winsock2.h>#include<string>#include<windows.h>using namespace std;#pragma comment(lib,"ws2_32.lib")UINT recvData(LPVOID lpp);class TcpSendHttp  {public:    TcpSendHttp();    virtual ~TcpSendHttp();    bool connectWeb(const char* ip,int port);    void createHttpHead(string head);    int sendHttpHead();    int recvHttpHead();    void keepLive();private:    string m_requestHead;//请求头    string m_responseHead;//响应头    string m_cookie;//服务器返回session    SOCKET m_socket;//套接字};TcpSendHttp::TcpSendHttp(){    m_requestHead="";    m_responseHead="";    m_cookie="";     //加载动态文件    WSADATA wsaData;    if(WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)    {        std::cout<<"up error"<<std::endl;        exit(1);    }}TcpSendHttp::~TcpSendHttp(){    closesocket(m_socket);    WSACleanup();}//连接服务器bool TcpSendHttp::connectWeb(const char* ip,int port){    SOCKADDR_IN addrSev;    addrSev.sin_addr.S_un.S_addr = inet_addr(ip);    addrSev.sin_port = htons(port);    addrSev.sin_family = AF_INET;    //请求连接    if(m_socket != NULL)        closesocket(m_socket);    m_socket = socket(AF_INET,SOCK_STREAM,0);        if(connect(m_socket,(SOCKADDR *)&addrSev,sizeof(SOCKADDR))<0)        {            std::cout<<"connect error"<<std::endl;            return false;        }        else        {            //DWORD threadId;            //CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recvData,&m_socket,0,&threadId);            return true;        }    }//创建HTTP头void TcpSendHttp::createHttpHead(string head){    m_requestHead+= head;}//发送int TcpSendHttp::sendHttpHead(){    int leng = send(m_socket,m_requestHead.c_str(),m_requestHead.length()+1,0);    if(leng!=(m_requestHead.length()+1))    {        return -1;    }    else     {        cout<<"send right"<<endl;        m_requestHead="";        return leng;    }}//接收int TcpSendHttp::recvHttpHead(){    m_responseHead="";    cout<<"recving"<<endl;    char answer[10240];    int resp_leng =10240;           resp_leng= recv(m_socket, (char*)&answer, 10240, 0);            if (resp_leng>0)     {        cout<<resp_leng<<endl;        m_responseHead+= string(answer).substr(0,resp_leng);          cout<<"响应头\n"<<m_responseHead<<endl;    }    if(m_cookie=="" && m_responseHead!="")    {        int cookieBegin = m_responseHead.find("Set-Cookie:",0);        int cookieEnd = m_responseHead.find("\r\n",cookieBegin);        m_cookie.append(m_responseHead,cookieBegin+4,cookieEnd-cookieBegin-12);    }    cout<<"recv over"<<endl;    return resp_leng;}//将cookie加入HTTP请求头中void TcpSendHttp::keepLive(){    m_requestHead =m_requestHead+m_cookie+"\r\n";}//自己尝试着用线程来recv/*UINT recvData(LPVOID lpp){    cout<<"thread begin"<<endl;    SOCKET temp = *((SOCKET*)lpp);    char answer2[1024];    int resp_leng2 =1024;          while(1)    {         resp_leng2= recv(temp,(char*)&answer2, 1024, 0);         if(resp_leng2>0)        {            answer2[resp_leng2] = '\0';            cout<<answer2<<"    "<<resp_leng2<<endl;            answer2[0]='\0';        }    }}*/int main(){/*    hostent *phe;      char *p;       phe = gethostbyname("www.9481.com");      cout<<phe<<endl;    if(phe!=NULL)      {        p = *phe->h_addr_list;         cout<<p<<endl;    }*/    TcpSendHttp tc;    tc.createHttpHead("POST http://www.9481.com HTTP/1.1\r\n");    tc.createHttpHead("Accept:*/*\r\n");    tc.createHttpHead("Accept-Language:zh-CN\r\n");    tc.createHttpHead("Referer:http://www.9481.com/login.html\r\n");    tc.createHttpHead("Content-Type:application/x-www-form-urlencoded\r\n");    tc.createHttpHead("Accept-Encoding: gzip, deflate\r\n");    tc.createHttpHead("Host:www.9481.com\r\n");    tc.createHttpHead("Content-Length:38\r\n");    tc.createHttpHead("Connection:close\r\n");    tc.createHttpHead("Cookie:Hm_lvt_0b7a95f009a5d8ebf1f7d6dc9350d96d=1347852750151,1347853144851; Hm_lpvt_0b7a95f009a5d8ebf1f7d6dc9350d96d=1347853144851; ASPSESSIONIDQQASBDCR=KONJGNDDGEHOEMOLIDAAPLIC; loginErrTimes=9");    tc.createHttpHead("Cache-Control: no-cache\r\n");    tc.createHttpHead("User-Agent:Mozilla/5.0 (Windows NT.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5\r\n");    tc.createHttpHead("\nusername:910612&password:910612&authCode: &\r\n");    tc.connectWeb("59.54.54.254",80);    int leng = tc.sendHttpHead();    cout<<"发送字节数"<<leng<<endl;    leng = tc.recvHttpHead();    cout<<"接收字节数"<<leng<<endl;    } 



[解决办法]
哈哈,你想做灌水机?你的格式是正确的,但是流程不对。很多网站都做了Cookie验证,你要先获取Cookie,并把得到Cookie作为发送参数。就是应该先GET,再POST.
[解决办法]
你这不就是HTTP协议吗,这里有源码例子,可以直接下载,找包里面的WebSrv(服务器),WebClnt(客户端)。来自《WinSock网络编程经络》,源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358

热点排行