首页 > 代码库 > socket抓取网页
socket抓取网页
#include <iostream> #include <string> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <strings.h> #include <string.h> #include <unistd.h> using namespace std; void func() { string url; cout << "输入网址:" << endl; cin >> url; //根据域名获取ip地址 struct hostent *website_host = NULL; website_host = gethostbyname(url.c_str()); if (website_host == NULL) { perror("gethostbyname error"); exit(-1); } cout << "主机名称:"; cout << website_host->h_name << endl; cout << "地址类型:"; cout << website_host->h_addrtype << endl; cout << "地址长度:"; cout << website_host->h_length << endl; //建立socket描述符 int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket error"); exit(-1); } cout << "建立socket完成" << endl; //初始化地址结构 struct sockaddr_in website_addr; bzero((void*)&website_addr, sizeof(website_addr)); website_addr.sin_family = AF_INET; website_addr.sin_port = htons(80); website_addr.sin_addr.s_addr = ((struct in_addr *)(website_host->h_addr))->s_addr; cout << "地址初始化完成" << endl; //连接 int ret; ret = connect(sockfd, (struct sockaddr*)&website_addr, sizeof(website_addr)); if (ret == -1) { perror("connect error"); exit(-1); } cout << "连接完成" << endl; //向80端口发送http头 char buf[10*1024]; char addr[100]; sprintf(buf, "GET / HTTP/1.1\r\n"); strcat(buf, "Host:"); strcat(buf,url.c_str()); strcat(buf, "\r\n"); strcat(buf, "Accept: */*\r\n"); strcat(buf, "User-Agent: Mozilla/4.0(compatible)\r\n"); strcat(buf, "connection:Keep-Alive\r\n"); strcat(buf, "\r\n\r\n"); cout << "请求头构造完成" << endl; cout << buf << endl; ret = send(sockfd, buf, strlen(buf), 0); cout << "发送完成" << endl; cout << "send:\n" << ret << endl; //打开接收文件 int fd; fd = open("recv.html", O_RDWR); if (fd == -1) { perror("open error"); exit(-1); } //开始接收 while(1) { ret = recv(sockfd, buf, sizeof(buf), 0); if (ret == 0) { cout << "对端关闭" << endl; exit(-1); } if (ret == -1) { perror("read error"); exit(-1); } buf[ret] = 0; cout << "recv:" << ret << endl; cout << buf << endl; write(fd, buf, strlen(buf)); } } int main() { func(); return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。