利用c++语言+socket实现HTTP请求,请求获得的数据效果图如下:

HTTP协议的下一层是TCP,根据HTTP协议只需要利用TCP发送下面的数据到达目标主机,目标主机就会发送相应的数据到客户端。

代码截图:

特别注意每一行末的\r\n

下面是代码实现:

//mySocket.h头文件
#include <Winsock2.h>
#include <Windows.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#include <string>
using namespace std; //只是对Socket中使用TCP协议的一种封装
class MySocket{
public:
static int InitClient(SOCKET *sock, string ip, int port);
static int CloseMySocket(SOCKET *Sock);
static int SendData(SOCKET sock, const string data);
static int RecvData(SOCKET sock, string &data);
};
//mySocket.c源码文件
 #include "mySocket.h" 

 //只是对Socket中使用TCP协议的封装

 int MySocket::InitClient(SOCKET *sock, string ip, int port)
{
WSADATA wsaData;//初始化wsaData
if (WSAStartup(MAKEWORD(, ), &wsaData) != )
{
return -;
} //创建套接字
if ((*sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
WSACleanup();
return -;
} struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = inet_addr(ip.c_str()); if (connect(*sock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
return -;
} return ;
} int MySocket::CloseMySocket(SOCKET *sock)
{
if (closesocket(*sock) == SOCKET_ERROR)
{
WSACleanup();
return -;
}
return ;
} int MySocket::RecvData(SOCKET sock, string &data)
{
int bufLen = ;
char buf[];
int recvLen= ;
int iResult;
buf[bufLen] = '\0';
while (true)
{
iResult = recv(sock, buf, bufLen, );
if (iResult < )
{
data = "";
return -;
} recvLen += iResult; if (iResult == )
{
return recvLen;
} if (iResult == bufLen)
{
data += buf;
ZeroMemory(buf, bufLen);
continue;
}
if (iResult > && iResult < bufLen)
{
data += buf;
return recvLen;
}
}
} int MySocket::SendData(SOCKET sock, const string data)
{
int iResult = send(sock, data.c_str(), data.length(), );
if (iResult == SOCKET_ERROR) {
MySocket::CloseMySocket(&sock);
WSACleanup();
return -;
} return ;
}
//main函数
#include <stdio.h>
#include <iostream>
#include<time.h>
#include "mySocket.h"
using namespace std;
int main()
{
SOCKET clientSock;
string str;
int iResult;
if (MySocket::InitClient(&clientSock, "42.121.254.229", ) == -)//主机IP地址+端口号
{
printf("连接失败\n");
return -;
}
string head = "GET / HTTP/1.1\r\n";
head.append("Host: m.cnblogs.com\r\n");//请求的域名
head.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n");
head.append("User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36\r\n");
head.append("Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n");
head.append("Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7");
head.append("Accept-Encoding: gzip,deflate\r\n");
head.append("\r\n");//表明请求头结束了
iResult = MySocket::SendData(clientSock, head);
if (iResult == -)
{
printf("发送数据失败\n");
return -;
}
iResult = MySocket::RecvData(clientSock, str); if (iResult == -)
{
printf("接受数据失败\n");
return -;
}
printf("----接受数据长度:%d----\n", iResult);
printf(str.c_str());
MySocket::CloseMySocket(&clientSock);
return ;
}

如果请求别的网站,有可能连返回的数据全部是乱码,那就是网站启用了gzip压缩了。

图中截图中文乱码,是因为返回的是UTF-8编码的字符,控制台默认是已GBK编码显示的。

socket编程实现HTTP请求的更多相关文章

  1. socket编程发送GET请求

    可以根据几根url地址,分析出主机,地址,协议等,然后用封装成的类拼接成GET请求信息,用fsockopen连接主机,进行读取操作,获取响应信息,打印 <?php //http连接接口 inte ...

  2. HTTP 笔记与总结(5)socket 编程:使用 HTTP 协议模拟登录并发帖

    在 VeryCD 上注册两个帐号,发送和接收站内信,观察 POST 请求时发送的参数(h****2 发送给 d***2).(最好用 FireFox 的 FireBug 工具,发送站内信之前选中 “保持 ...

  3. HTTP 笔记与总结(4 )socket 编程:批量发帖

    浏览器发送 POST 请求: 表单 form.html <!doctype html> <html lang="en"> <head> < ...

  4. HTTP 笔记与总结(3 )socket 编程:发送 GET 请求

    使用 PHP + socket 模拟发送 HTTP GET 请求,过程是: ① 打开连接 ② 构造 GET 请求的数据:写入请求行.请求头信息.请求主体信息(GET 请求没有主体信息) ③ 发送 GE ...

  5. 使用PHP Socket 编程模拟Http post和get请求

    这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法. <?php /** * 使用PHP ...

  6. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  7. java socket编程(li)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...

  8. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  9. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

随机推荐

  1. 破解软件系列-PE文件深入浅出之Section Table节表

    我们已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到 section table(节表)了.节表其实就是紧挨着 PE header 的一结构数组.该数组成员的数目 ...

  2. 说说C#和.NET的关系

    .NET和C#的关系:C#语言可以通过.NET平台编写.部署.运行.NET应用程序..NET可以支持包括C#在内的多种语言编写的应用程序..NET平台主要包括FCL(框架类库)它是微软事先定义好的类的 ...

  3. OSPF系列

    实验一.点对点链路上的OSPF 拓扑图 1. 首先配置好路由器R1接口地址和回环地址 2. 配置路由器R2的接口地址和回环地址 3. 配置路由器R3的接口地址和环回地址 4. 配置R1的OSPF协议 ...

  4. C语言知识总结(1)

    C语言中的数据类型 存在疑问,具体参考下面评论 变量的存储 变量实例 ; ; 内存由大到小寻址,优先分配内存地址较大的字节给变量.b的内存地址比a大 每个变量都有地址:第一个字节的地址就是变量的地址 ...

  5. (转)linux查看CPU性能及工作状态的指令mpstat,vmstat,iostat,sar,top

    衡量CPU性能的指标: 1,用户使用CPU的情况:CPU运行常规用户进程CPU运行niced processCPU运行实时进程 2,系统使用CPU情况:用于I/O管理:中断和驱动用于内存管理:页面交换 ...

  6. 16款最佳HTML5超酷动画演示及源码

    1.HTML5/CSS3图片选择动画 可选择多张图片 之前我们已经分享过几款很酷的HTML5图片特效,像HTML5 3D图片折叠特效.HTML5 3D旋转图片相册等应用.今天我们来分享一款既炫酷又实用 ...

  7. 常用的HTML标签

    文本样式标签 列表标签 有序列表 语法格式: <ol> <li></li> <li></li> <li></li> ...

  8. Redhat/Centos6.x-Samba配置

    安装: yum -y install samba samba-common samba-client 设置samba帐号 useradd smb passwd smb smbpasswd -a smb ...

  9. db.properties 数据库配置文件

    project.pool.initialPoolSize project.pool.minPoolSize project.pool.maxPoolSize project.db.tablePrefi ...

  10. Change http port in bitnami stack

    My case goes like this. I installed bitnami redmine first with port 80 for http service, but got pro ...