socket编程实现HTTP请求
利用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请求的更多相关文章
- socket编程发送GET请求
可以根据几根url地址,分析出主机,地址,协议等,然后用封装成的类拼接成GET请求信息,用fsockopen连接主机,进行读取操作,获取响应信息,打印 <?php //http连接接口 inte ...
- HTTP 笔记与总结(5)socket 编程:使用 HTTP 协议模拟登录并发帖
在 VeryCD 上注册两个帐号,发送和接收站内信,观察 POST 请求时发送的参数(h****2 发送给 d***2).(最好用 FireFox 的 FireBug 工具,发送站内信之前选中 “保持 ...
- HTTP 笔记与总结(4 )socket 编程:批量发帖
浏览器发送 POST 请求: 表单 form.html <!doctype html> <html lang="en"> <head> < ...
- HTTP 笔记与总结(3 )socket 编程:发送 GET 请求
使用 PHP + socket 模拟发送 HTTP GET 请求,过程是: ① 打开连接 ② 构造 GET 请求的数据:写入请求行.请求头信息.请求主体信息(GET 请求没有主体信息) ③ 发送 GE ...
- 使用PHP Socket 编程模拟Http post和get请求
这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法. <?php /** * 使用PHP ...
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
随机推荐
- 破解软件系列-PE文件深入浅出之Section Table节表
我们已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到 section table(节表)了.节表其实就是紧挨着 PE header 的一结构数组.该数组成员的数目 ...
- 说说C#和.NET的关系
.NET和C#的关系:C#语言可以通过.NET平台编写.部署.运行.NET应用程序..NET可以支持包括C#在内的多种语言编写的应用程序..NET平台主要包括FCL(框架类库)它是微软事先定义好的类的 ...
- OSPF系列
实验一.点对点链路上的OSPF 拓扑图 1. 首先配置好路由器R1接口地址和回环地址 2. 配置路由器R2的接口地址和回环地址 3. 配置路由器R3的接口地址和环回地址 4. 配置R1的OSPF协议 ...
- C语言知识总结(1)
C语言中的数据类型 存在疑问,具体参考下面评论 变量的存储 变量实例 ; ; 内存由大到小寻址,优先分配内存地址较大的字节给变量.b的内存地址比a大 每个变量都有地址:第一个字节的地址就是变量的地址 ...
- (转)linux查看CPU性能及工作状态的指令mpstat,vmstat,iostat,sar,top
衡量CPU性能的指标: 1,用户使用CPU的情况:CPU运行常规用户进程CPU运行niced processCPU运行实时进程 2,系统使用CPU情况:用于I/O管理:中断和驱动用于内存管理:页面交换 ...
- 16款最佳HTML5超酷动画演示及源码
1.HTML5/CSS3图片选择动画 可选择多张图片 之前我们已经分享过几款很酷的HTML5图片特效,像HTML5 3D图片折叠特效.HTML5 3D旋转图片相册等应用.今天我们来分享一款既炫酷又实用 ...
- 常用的HTML标签
文本样式标签 列表标签 有序列表 语法格式: <ol> <li></li> <li></li> <li></li> ...
- Redhat/Centos6.x-Samba配置
安装: yum -y install samba samba-common samba-client 设置samba帐号 useradd smb passwd smb smbpasswd -a smb ...
- db.properties 数据库配置文件
project.pool.initialPoolSize project.pool.minPoolSize project.pool.maxPoolSize project.db.tablePrefi ...
- 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 ...