WINSocket编程 发生HTTP GET请求,并接收服务器返回
2010-06-03 16:18
344 查看
首先要添加引用
#include "winsock2.h" //header
#pragma comment (lib, "ws2_32.lib") //lib
调用的代码:
BOOL HttpClient(std::string& rest) //用参数接收返回的字符数据
{
std::string errMsg;//错误信息记录
WSADATA wsaData;
SOCKET sock;
SOCKADDR_IN tcpaddr;
hostent * remoteHost;
char host[] = {"192.168.1.1"}; //主机名就直接写了
int Ret,l;
BOOL done;
int port = 80;
int chars = 0;
char buffer[1024];
if( (Ret = WSAStartup(MAKEWORD(1,1), &wsaData) ) != 0 )
{
errMsg+="WSAStartup failed with error "+Ret;
return 1;
}
if( (remoteHost = gethostbyname(host)) == NULL ) //通过主机名获取地址
{
errMsg+="gethostbyname error!\n";
return 1;
}
sock = socket (AF_INET, SOCK_STREAM, 0);
tcpaddr.sin_family = AF_INET;
tcpaddr.sin_port = htons( (unsigned short)port );
tcpaddr.sin_addr.s_addr = *((unsigned long *)*remoteHost->h_addr_list); //转换地址
if( connect(sock, (const sockaddr * )&tcpaddr, sizeof(tcpaddr)) )
{
errMsg+="connect error!";
return 1;
}
//这里是要发送的http头部
SendString(sock,"GET / HTTP/1.1\r\n");
SendString(sock,"Host:192.168.1.1\r\n");
SendString(sock,"Accept: */*\r\n");
SendString(sock,"User-Agent: Mozilla/4.0");
SendString(sock,"(compatible; MSIE 7.00; Windows 98)\r\n");
SendString(sock,"Connection:Keep-Alive\r\n");
SendString(sock,"\r\n");
SendString(sock,"\r\n");//最后要加空行
done = FALSE;
//FILE * fp;
//fp = fopen("1.txt","w");
//打印并保存http响应的头部
std::string str;
while(!done)
{
l = recv(sock,buffer,1,0);//一个字节一个字节的接受HTTP头
str+=*buffer;
if(l<0)
done=TRUE;
switch(*buffer)
{
case '\r':
break;
case '\n'://判断HTTP头是否接受完毕
if(chars==0)
done = TRUE;
chars=0;
break;
default:
chars++;
break;
}
printf("%c",str);
//fputc(buffer[0],fp);
}
//接收正文部分
int sum = 0;
do
{
l = recv(sock,buffer,1024,0);
if( l < 0 )
break;
sum += l;
str.append(buffer,l);
//*(buffer + l) = 0;
//fputs(buffer,fp);
} while( l > 0 );
//这里输出正文部分大小,发现其实和响应消息头部的Content-length大小是一样的
//这样就可以检查是否接受完毕
printf("sum = %d\n",sum);
closesocket(sock);
if( WSACleanup() == SOCKET_ERROR )
{
errMsg+="WSACleanup failed with error "+WSAGetLastError();
}
rest=str;
return 1;
}
void SendString(SOCKET sock,LPCSTR str)
{
send(sock,str,strlen(str),0);
}
#include "winsock2.h" //header
#pragma comment (lib, "ws2_32.lib") //lib
调用的代码:
BOOL HttpClient(std::string& rest) //用参数接收返回的字符数据
{
std::string errMsg;//错误信息记录
WSADATA wsaData;
SOCKET sock;
SOCKADDR_IN tcpaddr;
hostent * remoteHost;
char host[] = {"192.168.1.1"}; //主机名就直接写了
int Ret,l;
BOOL done;
int port = 80;
int chars = 0;
char buffer[1024];
if( (Ret = WSAStartup(MAKEWORD(1,1), &wsaData) ) != 0 )
{
errMsg+="WSAStartup failed with error "+Ret;
return 1;
}
if( (remoteHost = gethostbyname(host)) == NULL ) //通过主机名获取地址
{
errMsg+="gethostbyname error!\n";
return 1;
}
sock = socket (AF_INET, SOCK_STREAM, 0);
tcpaddr.sin_family = AF_INET;
tcpaddr.sin_port = htons( (unsigned short)port );
tcpaddr.sin_addr.s_addr = *((unsigned long *)*remoteHost->h_addr_list); //转换地址
if( connect(sock, (const sockaddr * )&tcpaddr, sizeof(tcpaddr)) )
{
errMsg+="connect error!";
return 1;
}
//这里是要发送的http头部
SendString(sock,"GET / HTTP/1.1\r\n");
SendString(sock,"Host:192.168.1.1\r\n");
SendString(sock,"Accept: */*\r\n");
SendString(sock,"User-Agent: Mozilla/4.0");
SendString(sock,"(compatible; MSIE 7.00; Windows 98)\r\n");
SendString(sock,"Connection:Keep-Alive\r\n");
SendString(sock,"\r\n");
SendString(sock,"\r\n");//最后要加空行
done = FALSE;
//FILE * fp;
//fp = fopen("1.txt","w");
//打印并保存http响应的头部
std::string str;
while(!done)
{
l = recv(sock,buffer,1,0);//一个字节一个字节的接受HTTP头
str+=*buffer;
if(l<0)
done=TRUE;
switch(*buffer)
{
case '\r':
break;
case '\n'://判断HTTP头是否接受完毕
if(chars==0)
done = TRUE;
chars=0;
break;
default:
chars++;
break;
}
printf("%c",str);
//fputc(buffer[0],fp);
}
//接收正文部分
int sum = 0;
do
{
l = recv(sock,buffer,1024,0);
if( l < 0 )
break;
sum += l;
str.append(buffer,l);
//*(buffer + l) = 0;
//fputs(buffer,fp);
} while( l > 0 );
//这里输出正文部分大小,发现其实和响应消息头部的Content-length大小是一样的
//这样就可以检查是否接受完毕
printf("sum = %d\n",sum);
closesocket(sock);
if( WSACleanup() == SOCKET_ERROR )
{
errMsg+="WSACleanup failed with error "+WSAGetLastError();
}
rest=str;
return 1;
}
void SendString(SOCKET sock,LPCSTR str)
{
send(sock,str,strlen(str),0);
}
相关文章推荐
- HttpClient get和HttpClient Post请求的方式获取服务器的返回数据
- HttpURL连接远程服务器Get和Post方式请求并返回数据
- 初涉Ajax,以post或get方法发送数据,以json或xml形式接收服务器返回的请求
- 接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。
- http get请求获取服务器返回的应答数据
- HTTP协议中GET、POST和HEAD的介绍 2008-05-10 14:15 GET: 请求指定的页面信息,并返回实体主体。 HEAD: 只请求页面的首部。 POST: 请求服务器接受所指定的文
- HttpClient get和HttpClient Post请求的方式获取服务器的返回数据
- HttpURLConnection 向服务器发送post和get请求 并接收响应
- 从客户发送http请求到服务器返回http之间发生了什么
- Js XMLHTTPRequest 实现GET请求提交和返回内容获取
- Java模拟httpGet请求并获取返回的数据
- Java爬虫(一)利用GET和POST发送请求,获取服务器返回信息
- 用HttpURLConnection 在Java后台发送请求并接收返回数据
- 【Angular】angular-HttpClient 与服务器通讯 Get Post Put Delete Http 拦截器 请求讲解
- 【Angular】angular-HttpClient 与服务器通讯 Get Post Put Delete Http 拦截器 请求讲解
- 【Angular】angular-HttpClient 与服务器通讯 Get Post Put Delete Http 拦截器 请求讲解
- Spring框架中接收Http客户端的Post和Get请求
- C#实现请求服务器,类似于asp下的getHTTPPage(url)功能
- AngularJs中$http发送post或者get请求,SpringMVC后台接收不到参数值的解决办法
- SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数