1.异构环境下的网络编程
不同的平台以不同的方式存放一个二进制。最常见的两种格式:大数在前的字节顺序和小数在前的字节顺序。
大字在前:将一个多字节数的高序字节存储在内存的其实地址。而小数在前的字节顺序刚好相反。
套接字编程接口(Socket API)提供了4个函数解决本机与网络的字节顺序:
htons():短整数本机顺序转换为网络顺序,用于端口号。
htonl():长整数本机顺序转换为网络顺序,用于IP地址。
ntohs():短整数网络顺序转换为本机顺序,用于端口号。
ntohl():长整数网络顺序转换为本机顺序,用于IP地址。
点分十进制的IP地址的转换:
unsigned long inet_addr(cost char *cp):
cp:点分十进制形式的IP地址。
返回值:网络字节序的IP地址,无符号长整数
char * int_ntoa(struct in_addr in):
in:包含长整数IP地址的in_addr结构变量。
返回值:点分十进制IP地址的字符串指针。
域名服务:
struct hostent * gethodtbyname(const char * name);
name:站点主机域名字符串。
返回值:是指向hostent结构指针
hostent:包含主机名,主机别名数组、返回地址的类型(一般是AF_INET)
2.阻塞与非阻塞
通信包括阻塞和非阻塞。
在阻塞模式下,利用TCP协议发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待直到协议有可用的空间。而非阻塞模式下调用将直接返回而不等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达数据,则调用将一直阻塞直到有数据到达或者出错,而非阻塞模式下,将直接返回不等待。
对于UDP协议而言,由于UDP没有发送缓存,因此UDP协议即使在阻塞模式下也不会发生阻塞。
3.套接字及类型
socket(套接字)是网络通信的基本构件,是可以被命名和寻址的通信端点,使用中的每一个套接字都有与其类型和与之相连的进程。
TCP/IP的socket提供三种类型的套接字:
*SOCK_STREAM(流式套接字):提供一个面向连接的、可靠的数据传输服务,数据无差错、无重复、且按发送顺序接收。内设流量控制,避免数据流超限。数据被看作是字节流,无长度限制。
*SOCK_DGRAM(数据报式套接字):提供一个无连接服务。数据报以独立包形式被发送,不提供无错保证。
*SOCK_RAW(原始套接字):该接口允许比较低层协议。