标签:Socket C++ 简单网络 tcp saddr sizeof include buf socket
需求
MinGW编程编译工具
#include “winsock2.h”
#pragma comment(lib,“ws2_32.lib”)
这两个是windows上网络访问时C++必需的头文件和库文件
代码
C++的Socket访问网页的机制分得比较细,不像其它编程语言能直接访问,步骤较多。
#include "winsock2.h"
#include <string>
#include <iostream>
#include <fstream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main(void) {
string url = "www.baidu.com";
int port = 80;
//这是启动网络访问功能
WSADATA wsa;
WSAStartup(2, &wsa);
//1.建立socket,socket是应用层必经网络访问虚拟层
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
//2.主网页URl转化下面 sockaddr_in用
struct hostent * hp = ::gethostbyname(url.c_str());
//访问地址
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
//赋值 hp->h_addr赋值到 saddr.sin_addr
memcpy(&saddr.sin_addr, hp->h_addr, 4);
//3.电脑上建立好了socket,并且连接上目标地址 saddr
connect(tcp_socket, (const struct sockaddr *)&saddr, sizeof(saddr));
//4.请求头,并通过建立好的socket发送request请求头信息,socket前面已经连接上目标url
string name="/";
string request = "GET " + name + " HTTP/1.1\r\nHost:" + url + "\r\nConnection:Close\r\n\r\n";
send(tcp_socket, request.c_str(), request.size(), 0);
//5. 保存文件声明
fstream file;
file.open("baidu.html", ios::out | ios::binary);
char buf[1024];
memset(buf, 0, sizeof(buf));
//6.接收响应的数据并写入前面声明的文件
int n = 0;
n = recv(tcp_socket, buf, sizeof(buf)-sizeof(char), 0);
char* cpos = strstr(buf, "\r\n\r\n");
file.write(cpos + strlen("\r\n\r\n"), n - (cpos - buf) - strlen("\r\n\r\n"));
while ((n = recv(tcp_socket, buf, sizeof(buf)-sizeof(char), 0)) > 0)
{
file.write(buf, n);
}
//7.文件关闭,socket关闭,WSA关闭
file.close();
closesocket(tcp_socket);
WSACleanup();
system("pause");
return 0;
}
请求头字符串的途径和格式
尾言
这只是一个简单的网页请求,爬虫比较复杂的事情,毕竟反爬虫方法很多,需要进一步研究。这是windows的网页请求,后面新增linux的网页请求。
标签:Socket,C++,简单网络,tcp,saddr,sizeof,include,buf,socket 来源: https://blog.csdn.net/LearnToPain/article/details/115290120
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。