18,356
社区成员
发帖
与我相关
我的任务
分享
#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;
}