socket通断检查

netinet/if_ether.h ether_arp的数据结构

netinet/ether.h 以太祯的网络字节和ascii字节的转换,包括ether_ntoa(),ether_aton这样的函数定义

netinet/ip.h 这个头文件和linux/ip.h似乎很相似,也有iphdr的数据结构,同时还包括了timestamp结构,我的理解是,linux文件夹下的 ip.h是linux黑客编写的ip头文件,而这个则是gnu一开始就定义的头文件,同时还包括了bsd中的ipheader结构定义。同理的还有该目录 下的tcp.h等文件

linux/ip.h iphdr的数据结构,以及一些ip层的数据定义,同理的还有tcp.h,udp.h等等

linux/if.h 主要的socket头文件,似乎修改自unix的if.h,定义了网卡的接口信息的宏,例如IFF_UP.另外有数个重要的interface的数据结构定义,包括ifreq,ifconf,ifmap

linux/if_packet.h 原始数据包的数据结构定义,包括sockaddr_pkt,sockaddr_ll,想接收原始数据包的不能错过这个文件。同理的还有if_ppp.h,if_tun.h等等

netinet/in.h 这个文件作的事情就多了。端口宏定义,著名ip(比如loopback),结构sockaddr_in,网络字节转换(ntoh,hton。。。。)。。。反正太多了,没事的话就把这个文件加到头文件包含里吧

netdb.h 文件如其名,包括结构hostent(主机环境),获得主机的信息的几个函数(gethostbyname)。似乎这个就是定义主机的各项环境,例如hostname等等

net/bpf.h berkeley的数据包过滤头文件,想用bpf进行包过滤的要重视一下这个文件

net/ethernet.h 包括几个以太网的数据结构,ether_addr(mac帧结构),ether_header(以太帧的头部)

-------------------------------

//primitive system data types(包含很多类型重定义,如pid_t、int8_t等)
//与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
//I/O控制操作相关的函数声明,如ioctl()
//某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
//某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
//某些函数声明,如inet_ntop()、inet_ntoa()等
//某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等

------------------------------

linux下socket编写常用头文件

#include //connect,send,recv,setsockopt等
#include

#include // sockaddr_in, “man 7 ip” ,htons
#include //poll,pollfd
#include //inet_addr,inet_aton
#include //read,write
#include //gethostbyname

#include //perror
#include
#include //errno

#include // memset

  • 测试socke 通断
//#define NET_PORT 53
//#define NET_IP "8.8.8.8" //谷歌DNS
#include 
#include    //connect,send,recv,setsockopt等
#include      
#include      // sockaddr_in, "man 7 ip" ,htons
#include              //poll,pollfd
#include    //inet_addr,inet_aton
#include         //read,write
#include          //gethostbyname
#include          //perror
#include 
#include          //errno
#include           // memset#define NET_PORT 80
#define NET_IP "www.baidu.com" //百度80端口//获取联网状态
int check_net_status(void)
{int fd;int in_len = 0;struct sockaddr_in servaddr;struct hostent *host;unsigned int inaddr = 0l;struct in_addr *ipaddr;in_len = sizeof(struct sockaddr_in);fd = socket(AF_INET, SOCK_STREAM, 0);if (fd < 0){perror("socket");return -1;}/*设置默认服务器的信息*/servaddr.sin_family = AF_INET;servaddr.sin_port = htons(NET_PORT);// servaddr.sin_addr.s_addr = inet_addr(NET_IP);memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero));/*判断是主机名还是ip地址*/if (inaddr = inet_addr(NET_IP) == INADDR_NONE){if ((host = gethostbyname(NET_IP)) == NULL) /*是主机名*/{perror("gethostbyname error");return (-1);}#ifdef DEBUGprintf("0IP Address : %s\n", inet_ntoa(*((struct in_addr *)host->h_addr)));printf("1IP Address : %s\n", inet_ntoa(*((struct in_addr *)host->h_addr_list[1])));printf("h_name : %s\n", host->h_name);printf("h_aliases : %s\n", host->h_aliases);printf("h_addrtype,h_length : %d,%d,AF_INET=%d\n", host->h_addrtype, host->h_length, AF_INET);
#endif//方法1:ipaddr = (struct in_addr *)host->h_addr;servaddr.sin_addr.s_addr = (ipaddr->s_addr);//方法2:这个算是多此一举了!多了一句无用功// inaddr = inet_addr(inet_ntoa(*ipaddr));// servaddr.sin_addr.s_addr = inaddr;}else /*是ip地址*/{servaddr.sin_addr.s_addr = inaddr;}/*connect 函数*/if (connect(fd, (struct sockaddr *)&servaddr, in_len) < 0){printf("connect failed t!\n ");close(fd);return 0; //没有联网成功}else{printf("=====connect ok!=====\n");close(fd);return 1;}
}
int main(char argc, char *argv[])
{check_net_status();
}

参考链接


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部