网络编程(二)——服务器和客户端信息的获取
目录
1、字符串IP地址和二进制IP地址结构的转换
2.套接字文件描述符的判定
3、IP地址与域名之间的相互转换
4、协议名称处理函数
1、字符串IP地址和二进制IP地址结构的转换
#include
#include
#include struct in_addr{
unsigned long int s_addr;
}int inet_aton(const char *cp, struct in_addr *inp);
/*将点分四段式的IP地址转为地址结构in_addr值*/
in_addr_t inet_addr(const char *cp);
/*将点分四段式的IP地址字符串转为地址结构in_addr值*/
in_addr_t inet_network(const char *cp);
/*将字符串地址的网络部分转为地址结构in_addr值*/
char *inet_ntoa(struct in_addr *inp);
/*将in_addr结构地址转为字符串*/
struct in_addr net_makeaddr(int net, int host);
/*将网络地址和主机地址合为IP地址*/
in_addr_t inet_lnaof(struct in_addr in);
/*获得地址的主机部分*/
in_addr_t inet_netof(struct in_addr in);
/*获得地址的网络部分*/
int inet_pton(int af, const char *src, void *dst);
/*根据协议族af将srcz转为struct in_addr的dst*/
const char *inet_pton(int af, const void *src, char *dst,socklen_t cnt);
/*根据协议族af将struct in_addr的src转为缓冲区大小为cnt的src*/
其中inet_ntoa与inet_addr是不可重入的。
可重入函数可以做这样的基本定义:重入意味着这个函数可以重复进入,可以被并行调用,可以被中断,它只使用自身栈上的数据变量,它不依赖于任务环境,在多任务调度过程中,它是安全的,不必担心数据出错。
【网络编程(二)——服务器和客户端信息的获取】不可重入函数基本上与可重入函数有相反的定义了:不可重入,意味着不可被并行调度,否则会产生不可预料的结果,这些函数提内一般使用了静态(static)的数据结构,使用了malloc()或者free()函数,使用了标准I/O函数等等。
例子请参考一下连接:
https://github.com/lixiangsheng2018/linux_network_programming/blob/master/chp8/trans.c
2.套接字文件描述符的判定 用fstat获取文件描述符的模式,然后将模式的S_IFMT部分与S_IFSOCK比较,就可以知道一个文件描述符是否为socket.
#include
#include
#include
int fstat(int fd, struct stat *buf);
struct stat {
dev_tst_dev;
/* ID of device containing file */
ino_tst_ino;
/* inode number */
mode_tst_mode;
/* protection */
nlink_tst_nlink;
/* number of hard links */
uid_tst_uid;
/* user ID of owner */
gid_tst_gid;
/* group ID of owner */
dev_tst_rdev;
/* device ID (if special file) */
off_tst_size;
/* total size, in bytes */
blksize_t st_blksize;
/* blocksize for file system I/O */
blkcnt_tst_blocks;
/* number of 512B blocks allocated */
time_tst_atime;
/* time of last access */
time_tst_mtime;
/* time of last modification */
time_tst_ctime;
/* time of last status change */
};
The following flags are defined for the st_mode field:
S_IFMT0170000bit mask for the file type bit fields
S_IFSOCK0140000socket
S_IFLNK0120000symbolic link
S_IFREG0100000regular file
S_IFBLK0060000block device
S_IFDIR0040000directory
S_IFCHR0020000character device
S_IFIFO0010000FIFO
S_ISUID0004000set UID bit
S_ISGID0002000set-group-ID bit (see below)
S_ISVTX0001000sticky bit (see below)
S_IRWXU00700mask for file owner permissions
S_IRUSR00400owner has read permission
S_IWUSR00200owner has write permission
S_IXUSR00100owner has execute permission
S_IRWXG00070mask for group permissions
S_IRGRP00040group has read permission
S_IWGRP00020group has write permission
S_IXGRP00010group has execute permission
S_IRWXO00007mask for permissions for others (not in group)
S_IROTH00004others have read permission
S_IWOTH00002others have write permission
S_IXOTH00001others have execute permission
例子请参考一下连接:
https://github.com/lixiangsheng2018/linux_network_programming/blob/master/chp8/issockettype.c
3、IP地址与域名之间的相互转换 DNS服务器功能:在主机的名称和IP地址之间担任翻译工作。
文章图片
#include
extern int h_errno;
struct hostent *gethostbyname(const char *name);
/*不可重入函数*/#include/* for AF_INET */
struct hostent *gethostbyaddr(const void *addr,socklen_t len, int type);
struct hostent {
char*h_name;
/* official name of host */
char **h_aliases;
/* alias list */
inth_addrtype;
/* host address type */
inth_length;
/* length of address */
char **h_addr_list;
/* list of addresses */
}
文章图片
例子参考一下连接:
https://github.com/lixiangsheng2018/linux_network_programming/blob/master/chp8/get_host.c
4、协议名称处理函数
#include struct protoent *getprotoent(void);
/*从协议文件/etc/protocols中读取一行*/
struct protoent *getprotobyname(const char *name);
/*从协议文件中找到匹配项*/
struct protoent *getprotobynumber(int proto);
/*按照协议类型的值找到匹配项*/
void setprotoent(int stayopen);
/*设置协议文件打开状态*/
void endprotoent(void);
/*关闭协议文件*/struct protoent {
char*p_name;
/* official protocol name */
char **p_aliases;
/* alias list */
intp_proto;
/* protocol number */
}
文章图片
使用协议族函数的例子:
https://github.com/lixiangsheng2018/linux_network_programming/blob/master/chp8/protocol.c
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 2019-02-13——今天谈梦想()
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 赢在人生六项精进二阶Day3复盘
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 2019年12月24日
- 陇上秋二|陇上秋二 罗敷媚