一, 寻址方式(IP地址表示)
在Windows Socket API 中,用户可以使用TPC/IP 地址家族中统一的套接字地址结构去处理 TCP/IP 中的寻址问题, 相关结构如下:
struct sockaddr_in{
short sin_family; //指定地址家族
unsigned sin_port; //端口号码
struct in_addr sin_addr; //IP地址
char sin_zero[8] //备用,常作0
}
备注:因为是涉及到TCP/IP 相关编程,因此 sin_family 必须指定为 AF_INET.
结构变量sin_addr表示32位的IP地址, 结构定义如下:
struct in_addr
{
union{
struct{
unsigned char s_b1, s_b2, s_b3, s_b4; //用4个u_char字符描述IP地址
}S_un_b;
struct{
unsigned short s_w1, s_w2; //用2个u_short类型描述IP地址
}S_un_w;
struct{
unsigned long s_addr; //用1个u_long类型描述IP地址
}S_un;
}
}
通常情况下用户会使用1个u_long类型表示IP地址,如要描述IP地址"127.0.0.1" 的代码如下:
sockaddr_in addr
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
二, 字节顺序
在Socket套接字编程中,传输数据的排列顺序分为: 网络字节顺序 及主机字节顺序 两种.
从数据角度来看,
网络字节顺序 会将数据中重要的字节先进行存储,
主机字节顺序 会将数据中不重要的字节先进行存储.
通常情况下,
若用户需要通过网络发送数据,则需要将数据转换成网络字节顺序排列,
若用户需要将从网络接收到的数据存储到本地主机上,则需要将数据转换成主机字节顺序排列.
以下几个函数可以进行网络字节顺序及主机字节顺序之间的转换:
u_short htons(u_short hostshort); // 将一个u_short类型的IP地址从主机字节顺序转换到网络字节顺序
u_short ntohs(u_short netshort); // 将一个u_short类型的IP地址从网络字节顺序转换到主机字节顺序
u_long htonl(u_long hostlong); // 将一个u_long类型的IP地址从主机字节顺序转换到网络字节顺序
u_long ntohl(u_long netlong); // 将一个u_long类型的IP地址从网络字节顺序转换到主机字节顺序
unsigned long inet_addr(const char FAR* cp); // 将一个字符串转换到以网络字节顺序排列的IP地址
char FAR* inet_ntoa(struct in_addr in); // 将一个网络字节顺序排列的IP地址转换成一个字符串IP
三, Socket套接字 相关函数
1.加载套接字库,创建并初始化套接字(socket())
socket()是创建套接字的函数,原型如下:
SOCKET socket(
int af, //指定套接字使用的地址格式,TCP/IP只能设定为AF_INET
int type, //套接字类型
int protocol //如果type已经指定套接字类型为TCP或UDP,则该参数设置为0
);