地址格式:
函数bind和getsockname使用通用数据类型:struct sockaddr*来指向socket地址。
#incude <sys/socket.h> struct sockaddr { short int sa_family, char sa_data[14] }
sa_family 指的是地址格式,
sa_data[14] 则是真正的地址内容。地址数据和格式挂钩的,什么样的格式对应什么样的内容。长度也依赖于格式,所以有可能大于14个字节。这里给出的14是任意的。。。。
以AF_开头的符号名指定了地址格式,而PF_开头的符号名指定了相应的命名空间。
AF_LOCAL
LOCAL指明了是本地地址,使用的是本地命名空间(PF_LOCAL)。
AF_UNIX
等同于AF_LOCAL。尽管AF_LOCAL被POSIX.1g强制要求,事实上AF_UNIX更具移植性。
AF_FILE
AF_LOCAL的另一个近义词
AF_INET
指明了地址位于Internet命名空间之下。PF_INET为其命名空间。
AF_INET6
与AF_INET相似,特指IPv6协议,命名空间为PF_INET6。
AF_UNSPEC
指明不使用特定的地址格式,很少情况下用这种地址格式。命名空间为PF_UNSPEC(只是为了完整性,才整出这么一个命名空间。
为socket设置地址:
通过bind函数将地址绑定给某个socket。
#include <sys/socket.h> int bind (int socket, struct sockaddr *addr, socklen_t length)
读取socket地址:
使用函数getsockname 来检查Internet socket的地址。
#include <sys/scoket.h> int getsockname (int socket, struct sockaddr *addr, socklen_t *length-ptr)
地址和地址长度通过*addr和*length-ptr返回。通常来讲,我们针对命名空间使用合适的数据类型申请空间来存放地址,然后将其强制转化为sockaddr *类型。