您的位置:首页 > 编程语言

套接字编程简介

2015-08-24 20:56 309 查看
这是unp的第三章,主要讲了一些基础的struct以及一些基础的API,这些struct在后面会一直使用的。

IPv4与IPv6的结构尽管不一样,但类似,连起名都只是IPv6的比IPv4的多来个6,如:struct in6_addr与struct in_addr,struct sockaddr_in6与struct_ sockaddr_in等。猜想之所以是sockaddr_in而不是sockaddr_in4(自己根据IPv6的命名杜撰出来的)是为了保持向后兼容,以前IPv6没出现的时候只有IPv4,一直都是这么用的。

值-结构参数

书中提到的值-结构参数,据我理解,其实就是把一个指针传给函数,其指向的值可变(没有const修饰),即该变量即作为输入又保存输出。

字节排序函数

之所以有这系列的函数,我的理解是:有的系统采用小端字节序,有的系统采用大端字节序,而网际协议使用大端字节序。为了保证在网络上传输的时候与网际协议一致(即大端字节序),就在提供来这些字节排序函数,这样保证发送时的字节序正确,同时从网络接受到字节序时,转换位与系统相一致的字节序。

ps:将低序字节存储在起始地址,称为小端字节序;将高序字节存储在起始地址,称为大端

字节操纵函数

书中提到来3个字节操纵函数:bzero, bcopy, bcmp,同时提到来三个ANSI C函数:memset, memcpy, memcmp。之所以提供前三个函数,而不用后三个,是因为,当处理套接字地址结构时,操纵诸如IP地址这样的字段,这些字段可能包含值为0的字节,却并不是C字符串(C字符串以0作为结束的标志)。另外需要注意的是,当源字节串与目标字节串重叠时,bcopy能够正确处理,但是memcpy的操作结果不可知。(突然想起之前在游族面试的时候遇到过这个考题,就是让写个类似与memcpy的函数的,如果不考虑地址重叠肯定就达不到要求了,另外,还要注意源地址与目标地址谁大谁小的问题,以此确定拷贝顺序)

地址转换函数

作者都说了,全书后面部分都将采用inet_pton与inet_ntop,所以inet_aton,inet_addr, inet_ntoa这三个函数,了解一下即可,看得懂就行了,看作者字里行间的意思,后面会一直使用前两个函数。地址转换函数是在ASCII字符串与网络字节序的二进制值之间转换网际协议地址的。说通俗一点,就是你写程序的时候写192.168.10.5这样的IP地址,这是ASCII字符串,但你需要的填的套接字地址结构不认识啊,这个时候地址转换函数就起作用了,这些函数的作用就像翻译员一样。

本书作者提供的一些方便函数

后面作者为了写程序的方便,写了一些函数,如:本来inet_ntop这个函数是协议相关的,即,如果是为IPv4编写代码,是这样的:

struct sockaddr_in addr;
inet_ntop(AP_INET, &addr.sin_addr, str, sizeof(str));


但为IPv6编写代码,是这样的:

struct sockaddr_in6 addr6;
inet_ntop(AF_INET6, &addr6.sin6_addr, str, sizeof(str));


作者写来个协议无关函数:

char *sock_ntop(const struct sockaddr *sockaddr, socklen_t addrlen);


其实就是利用struct sockaddr中的sa_family来区分是什么协议,内部还是调用inet_ntop。这里注意,得到的ASCII字符串不再是前面提到的值-结果参数了,而是用return返回。代码中return的str是静态的,用了static修饰,否则会成为野指针。

作者还提供来其他一些方便函数,这里就不一一列举了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  套接字 编程 基础