(原创)socket学习实验(一)——利用C 语言socket抓取一个网页内容
来源:互联网 发布:影楼后期软件 编辑:程序博客网 时间:2024/05/02 04:10
(纯手打,有问题可以交流)
最近在学习socket,然后做了一些小的实验,发现socket功能还真是强大,对于socket流使套接字在某种程度上其实是与终端的telnet相似的,IP地址对应socket里的sock地址,端口对应sock里的端口,然后就看自己在终端里发送命令,就如同利用socket的send和recv方法了,
我在终端上测试一个telnet,获取一个网页的内容:
~:telnet www.baidu.com 80 //首先进入到telnet
输入:GET / HTTP/1.1
输入:host bolg.chinaunix.net
回车后再按一次回车,就能获取网页代码:数量太大,仅仅粘贴一部分:
这样就通过telnet抓取到一个网页,而利用socket也是如此,只是发送消息时将消息格式给变一下,就能实现这个功能:而我是将抓取的网页内容写到一个临时的html文件里,这样就可以将抓取的网页文件在浏览器中打开了,代码贴出:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <fcntl.h>
#define PORT 80
//char *cmd = "GET / HTTP/1.1 \nhost:www.xust.edu.cn";
int main(int arg,char **argc)
{
printf("11111111\n");
int sockfd;
int fd;
struct sockaddr_in servaddr;
char buf[1024] ;
char tmp1[100];
char cmd[1024];
//char *cmd="GET /uid/30510400.html HTTP/1.1\r\nhost:blog.chinaunix.net\r\n\r\n";
struct hostent *host;
int n=0;
if((fd = open("text.html",O_CREAT|O_TRUNC|O_WRONLY)) < 0){
fprintf(stderr,"open error:%s\n",strerror(errno));
return -1;
}
if(arg != 2 ){
fprintf(stderr,"usage:./a.out IPaddress:%s\n",strerror(errno));
return -1;
}
printf("enter the web page path you want to grub,and if you want the all press enter key ");
fgets(tmp1,100,stdin);
tmp1[strlen(tmp1) - 1] = '\0';
sprintf(cmd,"GET /%s HTTP/1.1\r\nhost:%s\r\n\r\n",tmp1,argc[1]);
if((host = gethostbyname(argc[1])) == NULL){
fprintf(stderr,"get host by name error:%s\n",strerror(errno));
return -1;
}
printf("hostname:%s\n",host->h_name);
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
fprintf(stderr,"socket creat error :%s\n",strerror(errno));
return -1;
}
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n)) < 0){
fprintf(stderr,"set sock option error:%s\n",strerror(errno));
return -1;
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
// servaddr.sin_addr = *((struct in_addr *)host->h_addr);
servaddr.sin_addr = *((struct in_addr *)host->h_addr);
servaddr.sin_port = htons(PORT);
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0){
fprintf(stderr,"connect error:%s\n",strerror(errno));
return -1;
}
if(send(sockfd,cmd,strlen(cmd),0) < 0){
fprintf(stderr,"send error:%s\n",strerror(errno));
return -1;
}
while(1){
if(recv(sockfd,buf,2048,0) < 1)
break;
write(fd,buf,strlen(buf));
}
close(sockfd);
close(fd);
printf("bye!\n");
return -1;
}
gcc编译之后运行:
因为我想抓取我博客中的一篇文章,网址是这个http://blog.chinaunix.net/uid-30510400-id-5378031.html,所以我输入:uid-30510400-id-5378031.html
最后在当前目录下就能看到text.html文件,用浏览器打开,便可以看到自己抓取的那个网页,
很神奇吧,可以尝试抓取一下哦!
最近在学习socket,然后做了一些小的实验,发现socket功能还真是强大,对于socket流使套接字在某种程度上其实是与终端的telnet相似的,IP地址对应socket里的sock地址,端口对应sock里的端口,然后就看自己在终端里发送命令,就如同利用socket的send和recv方法了,
我在终端上测试一个telnet,获取一个网页的内容:
~:telnet www.baidu.com 80 //首先进入到telnet
输入:GET / HTTP/1.1
输入:host bolg.chinaunix.net
回车后再按一次回车,就能获取网页代码:数量太大,仅仅粘贴一部分:
这样就通过telnet抓取到一个网页,而利用socket也是如此,只是发送消息时将消息格式给变一下,就能实现这个功能:而我是将抓取的网页内容写到一个临时的html文件里,这样就可以将抓取的网页文件在浏览器中打开了,代码贴出:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <fcntl.h>
#define PORT 80
//char *cmd = "GET / HTTP/1.1 \nhost:www.xust.edu.cn";
int main(int arg,char **argc)
{
printf("11111111\n");
int sockfd;
int fd;
struct sockaddr_in servaddr;
char buf[1024] ;
char tmp1[100];
char cmd[1024];
//char *cmd="GET /uid/30510400.html HTTP/1.1\r\nhost:blog.chinaunix.net\r\n\r\n";
struct hostent *host;
int n=0;
if((fd = open("text.html",O_CREAT|O_TRUNC|O_WRONLY)) < 0){
fprintf(stderr,"open error:%s\n",strerror(errno));
return -1;
}
if(arg != 2 ){
fprintf(stderr,"usage:./a.out IPaddress:%s\n",strerror(errno));
return -1;
}
printf("enter the web page path you want to grub,and if you want the all press enter key ");
fgets(tmp1,100,stdin);
tmp1[strlen(tmp1) - 1] = '\0';
sprintf(cmd,"GET /%s HTTP/1.1\r\nhost:%s\r\n\r\n",tmp1,argc[1]);
if((host = gethostbyname(argc[1])) == NULL){
fprintf(stderr,"get host by name error:%s\n",strerror(errno));
return -1;
}
printf("hostname:%s\n",host->h_name);
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
fprintf(stderr,"socket creat error :%s\n",strerror(errno));
return -1;
}
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n)) < 0){
fprintf(stderr,"set sock option error:%s\n",strerror(errno));
return -1;
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
// servaddr.sin_addr = *((struct in_addr *)host->h_addr);
servaddr.sin_addr = *((struct in_addr *)host->h_addr);
servaddr.sin_port = htons(PORT);
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0){
fprintf(stderr,"connect error:%s\n",strerror(errno));
return -1;
}
if(send(sockfd,cmd,strlen(cmd),0) < 0){
fprintf(stderr,"send error:%s\n",strerror(errno));
return -1;
}
while(1){
if(recv(sockfd,buf,2048,0) < 1)
break;
write(fd,buf,strlen(buf));
}
close(sockfd);
close(fd);
printf("bye!\n");
return -1;
}
gcc编译之后运行:
因为我想抓取我博客中的一篇文章,网址是这个http://blog.chinaunix.net/uid-30510400-id-5378031.html,所以我输入:uid-30510400-id-5378031.html
最后在当前目录下就能看到text.html文件,用浏览器打开,便可以看到自己抓取的那个网页,
很神奇吧,可以尝试抓取一下哦!
0
上一篇:linux内核——进程管理
下一篇:Linux 同步方法剖析--内核原子,自旋锁和互斥锁
相关热门文章
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- (原创)socket学习实验(一)——利用C 语言socket抓取一个网页内容
- C语言使用socket获取网页内容
- 利用socket获取网页内容
- Java Socket学习(一)——Socket简单连接
- 利用htmlparser抓取网页内容(一)
- socket应用(一)如何利用C语言写文件传输的程序
- socket应用(一)如何利用C语言写文件传输的程序
- socket抓取网页
- C语言SOCKET学习
- Socket学习(一)
- [Python3.x]网络爬虫(一):利用urllib通过指定的URL抓取网页内容
- 通过java.net.Socket 类抓取网页内容
- Java 通过 Socket 的形式抓取网页内容
- ObjC利用正则表达式抓取网页内容(网络爬虫)
- ObjC利用正则表达式抓取网页内容(网络爬虫)
- 利用python抓取网页各种类型内容(静态、动态)
- ObjC利用正则表达式抓取网页内容(网络爬虫)
- ObjC利用正则表达式抓取网页内容(网络爬虫)
- msgrcv error : Identifier removed(ERMID)错误解决;
- 字符编码常识及问题解析
- Linux进程间通信——消息队列:
- 【格灵深瞳】电话面试
- linux内核——进程管理
- (原创)socket学习实验(一)——利用C 语言socket抓取一个网页内容
- Linux 同步方法剖析--内核原子,自旋锁和互斥锁
- adb shell中设置android系统内部环境变量!
- 面对自己:如何让自己成为真正的程序员
- ReactNative学习二
- HDU-4569 Special equations (数学)
- Android ADB中使用find命令
- Andrid进阶_Ksoap2访问WebService出现错误SoapFault
- static的作用
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
敞篷跑车排行榜
汽车论坛排行榜
紧凑型车排行榜
汽车品牌排行榜
汽车投诉排行榜
风云榜
搜索风云榜
家庭轿车销量排行榜
网站建设公司排行榜
神途排行榜
秋衣品牌排行榜
10万车排行榜
男子医院排行榜
洁面膏排行榜
亚洲球员身价排行
千元机性价比排行
笔记本性价比排行
sedo今日短片排行
国内眼镜品牌排行
色dog绅士常来今日排行
星巴克各国价格排行
女士太阳镜品牌排行
全国精神病医院排行
排酸
排酸的好处
排酸肉
酸甜脆骨排
排酸汗液颜色对照表
痛风排酸胶囊
佛排酸
排酸的好处与坏处
排酸仪器的功效
女性排酸的好处与坏处
美容院身体排酸毒图片
排酸茶
排酸肉与鲜肉的区别
汽车排量
摩托车排量
排量
排量车船税
发动机排量