Linux下http协议GET通讯的C语言实现.docx
- 文档编号:15355931
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:6
- 大小:15.89KB
Linux下http协议GET通讯的C语言实现.docx
《Linux下http协议GET通讯的C语言实现.docx》由会员分享,可在线阅读,更多相关《Linux下http协议GET通讯的C语言实现.docx(6页珍藏版)》请在冰点文库上搜索。
Linux下http协议GET通讯的C语言实现
Linux下http协议GET通讯的C语言实现
from
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<errno.h>
#include<unistd.h>
#include<netinet/in.h>
#include<limits.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<ctype.h>intmain(intargc,char*argv[])
{
intsockfd;
charbuffer[1024];
structsockaddr_inserver_addr;
structhostent*host;
intportnumber,nbytes;
charhost_addr[256];
charhost_file[1024];
charlocal_file[256];
FILE*fp;
charrequest[1024];
intsend,totalsend;
inti;
char*pt;if(argc!
=2)
{
fprintf(stderr,"Usage:
%sweb-address\a\n",argv[0]);
exit
(1);
}
portnumber=80;
strcpy(host_addr,argv[1]);
if((host=gethostbyname(argv[1]))==NULL)/*取得主机IP地址*/
{
fprintf(stderr,"Gethostnameerror,%s\n",strerror(errno));
exit
(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*建立SOCKET连接*/
{
fprintf(stderr,"SocketError:
%s\a\n",strerror(errno));
exit
(1);
}
/*客户程序填充服务端的资料*/
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((structin_addr*)host->h_addr);/*客户程序发起连接请求*/
if(connect(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))==-1)/*连接网站*/
{
fprintf(stderr,"ConnectError:
%s\a\n",strerror(errno));
exit
(1);
}sprintf(request,"GET/%sHTTP/1.1\r\nAccept:
*/*\r\nAccept-Language:
zh-cn\r\n\
User-Agent:
Mozilla/4.0(compatible;MSIE5.01;WindowsNT5.0)\r\n\
Host:
%s:
%d\r\nConnection:
Close\r\n\r\n",host_file,host_addr,portnumber);
printf("%s",request);/*准备request,将要发送给主机*//*取得真实的文件名*/
strcpy(local_file,"index.html");
/*发送http请求request*/
send=0;totalsend=0;
nbytes=strlen(request);
while(totalsend<nbytes){
send=write(sockfd,request+totalsend,nbytes-totalsend);
if(send==-1){printf("senderror!
%s\n",strerror(errno));exit(0);}
totalsend+=send;
printf("%dbytessendOK!
\n",totalsend);
}fp=fopen(local_file,"a");
if(!
fp){
printf("createfileerror!
%s\n",strerror(errno));
return0;
}
printf("\nThefollowingistheresponseheader:
\n");
i=0;
/*连接成功了,接收http响应,response*/
while((nbytes=read(sockfd,buffer,1))==1)
{
if(i<4){
if(buffer[0]=='\r'||buffer[0]=='\n')i++;
elsei=0;
printf("%c",buffer[0]);/*把http头信息打印在屏幕上*/
}
else{
fwrite(buffer,1,1,fp);/*将http主体信息写入文件*/
i++;
if(i%1024==0)fflush(fp);/*每1K时存盘一次*/
}
}
fclose(fp);
/*结束通讯*/
close(sockfd);
exit(0);
}
1structhostent*gethostbyname(constchar*name);
这个函数完成进行域名和IP地址的转换,返回的为:
structhostent{
char*h_name;/*主机的官方域名*/
char**h_aliases;/*一个以NULL结尾的主机别名数组*/
inth_addrtype;/*返回的地址类型,在Internet环境下为AF-INET*/
inth_length;/*地址的字节长度*/
char**h_addr_list;/*一个以0结尾的数组,包含该主机的所有地址*/
};
#defineh_addrh_addr_list[0]/*在h-addr-list中的第一个地址*/
我们一般用的也就第一个地址
2接下去就是SOCKET的建立,绑定,连接,我们想要连接,上面得到的ip地址是不行的,我们要使用服务器的地址,具体数据结构如下:
structsockaddr_in{
shortintsin_family;/*地址族*/
unsignedshortintsin_port;/*端口号*/
structin_addrsin_addr;/*IP地址*/上面得到的地址
unsignedcharsin_zero[8];/*填充0以保持与structsockaddr同样大小*/
};
这里也提下structsockaddr这个是描述sock地址信息的,和上面的结构大小一样,可以相互转换
structsockaddr{
unsignedshortsa_family;/*地址族,AF_xxx*/
charsa_data[14];/*14字节的协议地址*/
}
3我们和服务器连上之后,就可以向服务器发送请求了
write(sockfd,char*,size);
内容就是:
GET/%sHTTP/1.1\r\nAccept:
*/*\r\nAccept-Language:
zh-cn\r\n\User-Agent:
Mozilla/4.0(compatible;MSIE5.01;WindowsNT5.0)\r\n\
Host:
%s:
%d\r\nConnection:
Close\r\n\r\n
具体是由其协议定的,我也还不是很清楚
4服务器响应,就会发来信息头+实际页面的信息,这个中间是有4个("\r"或"\n")进行分开的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux http 协议 GET 通讯 语言 实现