计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Internet 上数据以高
位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,
在 Internet 上传输数据时就需要进行转换。
我们要讨论的第一个结构类型是:struct sockaddr,该类型是用来保存 socket 信息的:
struct sockaddr {
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */ };
sa_family 一般为 AF_INET;sa_data 则包含该 socket 的 IP 地址和端口号。
另外还有一种结构类型:
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IP 地址 */
unsigned char sin_zero[8]; /* 填充 0 以保持与 struct sockaddr 同样大小 */
};
这个 结 构 使 用 更 为 方 便 。 sin_zero( 它 用 来 将 sockaddr_in 结 构 填 充 到 与 struct
sockaddr 同样的长度)应该用 bzero()或 memset()函数将其置为零。指向 sockaddr_in 的指针和
指向 sockaddr 的指针可以相互转换,这意味着如果一个函数所需参数类型是 sockaddr 时,
你可以在函数调用的时候将一个指向 sockaddr_in 的指针转换为指向 sockaddr 的指针;或者
相反。sin_family 通常被赋 AF_INET;sin_port 和 sin_addr 应该转换成为网络字节优先顺序;
而 sin_addr 则不需要转换。
我们下面讨论几个字节顺序转换函数:
htons()--"Host to Network Short" ; htonl()--"Host to Network Long"
ntohs()--"Network to Host Short" ; ntohl()--"Network to Host Long"
在这里, h 表示"host" ,n 表示"network",s 表示"short",l 表示 "long"。
打开 socket 描述符、建立绑定并建立连接
socket 函数原型为:
int socket(int domain, int type, int protocol);
参数 domain 指定使用何种的地址类型,完整的定义在/usr/include/bits/socket.h 内,常见
的定义如下
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通讯协议 P
PF_INET/AF_INENT IPV4 网络协议
PF_INET6/AF_INET6 IPv6 网络协议
PF_IPX/AF_IPX IPX-Novell 协议
PF_NETLINK/AF_NETLINK 核心用户接口装置
PF_X25/AF_X25 ITU-T X.25/ISO-8208 协议
PF_AX25/AF_AX25 业余无线 AX.25 协议
PF_ATMPVC/AF_ATMPVC 存取原始 ATM PVCs
PF_APPLETALK/AF_APPLETALK Appletalk(DDP)协议
PF_PACKET/AF_PACKET 初级封包接口