文档介绍:网络编程要考虑的问题
并发环境下的网络编程
异构环境下的网络编程
阻塞与非阻塞通信
服务类型的选择
差错处理
并发环境
1、函数可重入问题
2、资源共享访问控制,即互斥与同步
3、系统资源释放与回收
4、大量并发线程的创建管理
异构环境
字节顺序(Big endian , Little endian )
LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位反之,高位值就应该放在内存地址大的地方,也即内存地址高位
BE big-endian最直观的字节序地址低位存储值的高位地址高位存储值的低位为什么说直观,不要考虑对应关系只需要把内存地址从左到右按照由低到高的顺序写出把值按照通常的高位到低位的顺序写出两者对照,一个字节一个字节的填充进去
(1)主机字节序
不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。处理器操作系统字节排序Alpha 全部 Little endianHP-PA NT Little endianHP-PA UNIX Big endianIntelx86 全部 Little endian <-----x86系统是小端字节序系统Motorola680x() 全部 Big endianMIPS NT Little endianMIPS UNIX Big endianPowerPC NT Little endianPowerPC 非NT Big endian <-----PPC系统是大端字节序系统RS/6000 UNIX Big endianSPARC UNIX Big endianIXP1200 ARM核心全部 Little endian endian的字节顺序。
(续)
(2)例如
将0x1234abcd写入到以0x0000开始的内存中,则结果为 big-endian little-endian0x0000 0x12 0xcd0x0001 0x23 0xab0x0002 0xab 0x340x0003 0xcd 0x12x86系列CPU都是little-endian的字节序.
(3)网络字节序:big endian
TCP/IP中规定好的一种数据表示格式,与具体的CPU类型、操作系统等无关。
(4)字节顺转换函数
socket API提供了转换的函数有下面四个htons 把unsigned short类型从主机序转换到网络序htonl 把unsigned long类型从主机序转换到网络序ntohs 把unsigned short类型从网络序转换到主机序ntohl 把unsigned long类型从网络序转换到主机序
(续)
字的长度
不同的实现对于相同的数据类型可能有不同的表示长度。如,64位操作系统与32位操作系统中,类型long int的长度是不一样的。
16位平台
char 1个字节8位
short 2个字节16位
int 2个字节16位
long 4个字节32位
指针 2个字节
32位平台
char 1个字节8位
short 2个字节16位
int 4个字节32位
long 4个字节
long long 8个字节
指针 4个字节
64位平台
char 1个字节
short 2个字节
int 4个字节
long 8个字节(区别)
long long 8个字节
指针 8个字节(区别)
(续)
字节定界问题
一般情况下,操作系统在分配内存时,数据结构以4字节定界。
struct s{int a;char b;double c;union d { char e[6]; int f[3]; }
}
网络协议的设计中,常常需要填充一些无用的字节以满足四字节定界,从而简化协议的实现。
阻塞与非阻塞通信
在阻塞模式下,利用TCP协议发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待直到协议有可用的空间。而在非阻塞模式下,调用将直接返回而不需等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞直到有数据到达或出错;而在非阻塞模式下,将直接返回而不需等待。
对于UDP 协议而言,因为UDP没有发送缓存,所有UDP协议即使在阻塞模式下也不会发生阻塞。
对于面向连接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。在阻塞模式下,如果没有连接请求到达,则等待连接调用将阻塞直到有连接请求到达;但在非阻塞模式下,如果没有连接请求到达,等待连接调用将直接返回。
在连接建立阶段,不管是