sock访问网站?

leon_罗 2012-09-17 01:00:14
一个网络地址可能对应着多个网站 ,我们访问这个网络地址的时候是通过主机头来分别我们要去的网站
我用socket访问网站,在哪里加入主机头,怎么加入?
下面是我的代码 :请指教
#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;
}
...全文
154 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
leon_罗 2012-09-18
  • 打赏
  • 举报
回复
不是哦 练手的
能帮我改下吗
search_you 2012-09-18
  • 打赏
  • 举报
回复
哈哈,你想做灌水机?你的格式是正确的,但是流程不对。很多网站都做了Cookie验证,你要先获取Cookie,并把得到Cookie作为发送参数。就是应该先GET,再POST.
leon_罗 2012-09-18
  • 打赏
  • 举报
回复
没人回答 自己顶下
laqhelen 2012-09-18
  • 打赏
  • 举报
回复
你这不就是HTTP协议吗,这里有源码例子,可以直接下载,找包里面的WebSrv(服务器),WebClnt(客户端)。来自《WinSock网络编程经络》,源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358

18,356

社区成员

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

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