incluce <netdb.h>
struct hostent* gethostbyname(char const* host_name);
功能:传递主机域名,获取主机信息
参数:host_name 主机域名
返回值:函数执行成功返回表示主机信息的结构体指针,失败返回NULL
struct hostent{
char *h_name; //主机官方名
char **h_aliases; //主机别名表
int h_addrtype; //地址类型
int h_length; //地址长度
char **h_addr_list; //IP地址表
};
//域名解析
#include<stdio.h>
#include<arpa/inet.h>
#include<netdb.h>
int main(int argc,char* argv[]){
//./dns www.baidu.com
struct hostent* h = gethostbyname(argv[1]);
if(h == NULL){
perror("gethostbyname");
return -1;
}
printf("主机官方名:\n");
printf("%s\n",h->h_name);
printf("主机别名表:\n");
for(char** pp = h->h_aliases;*pp;pp++){
printf("%s\n",*pp);
}
printf("IP地址表:\n");
for(struct in_addr** pp = (struct in_addr**)h->h_addr_list;*pp;pp++){
printf("%s\n",inet_ntoa(**pp));
}
return 0;
}
http请求{
方法+url+协议版本{
HTTP1.0定义了三种请求方法:GET, POST和HEAD
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT
}
请求头{
Accept:客户端接收类型,*/*所以类型,type/*该类型下的所有子类型
Host:服务器绑定的域名
User_Agent:浏览器表名自己的身份,是那种浏览器
Referer:客户端跳转前的网址
Connection:表示是否需要持久连接(keep-alive: (默认) / close: )
}
}
http响应{
协议版本+状态码+状态码原因短语{
200 OK:客户端请求成功
400 Bad Request:客户端请求有语法错误,不能被服务器所理解
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在,举个例子:输入了错误的URL
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
}
响应头{
Date:响应时间
Content-Type:响应类型
Content-Length:响应数据大小
Connection:连接状态
}
}
//http协议
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
int main(void){
//创建套接字
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1){
perror("socket");
return -1;
}
//组织服务器地址结构
struct sockaddr_in ser;
ser.sin_family = AF_INET;
ser.sin_port = htons(80);
ser.sin_addr.s_addr = inet_addr("61.241.13.229");
//发起连接
if(connect(sockfd,(struct sockaddr*)&ser,sizeof(ser)) == -1){
perror("connect");
return -1;
}
//发送请求
char request[1024] = {};
sprintf(request,"GET / HTTP/1.1\r\n"
"Host: www.flor.cn\r\n"
"Accept: */*\r\n"
"Connection: close\r\n\r\n");
if(send(sockfd,request,strlen(request),0) == -1){
perror("send");
return -1;
}
//接收响应
for(;;){
char respond[1024] = {};
ssize_t size = recv(sockfd,respond,sizeof(respond)-1,0);
if(size == -1){
perror("recv");
return -1;
}
if(size == 0){
break;
}
printf("%s",respond);
}
printf("\n");
//关闭套接字
close(sockfd);
return 0;
}