1.使用统一的寻址方式的目的:
为了区分程序所使用的网络协议
2.寻址的目的:
为了准确定位通讯双方
eg:在TCP/IP协议通信中,用户使用IP地址和端口号确定通信双方,而在其他协议中不一定也使用该方式确定通信双方
Ps:因为套接字需要在各种网络协议中使用,所以为了区分程序所使用的网络协议,必须使用统一的寻址方式
3.windows网络编程中,Winsock(即windows上封装的socket API),可以使用TCP/IP地址家族中统一的套接字地址结构解决TCP/IP寻址可能出现的问题
3.1TCP/IP地址家族中统一的套接字地址结构:
struct sockaddr_in
{
short sin_family;//--指定地址家族(即地址格式)
unsigned short sin_port; //--端口号
struct in_addr sin_addr;//--IP地址,表示32位的IP地址结构
char sin_zero[8];//--为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节,需要指定为0
};
Ps:sockaddr是TCP/IP地址家族中第一个版本的套接字地址结构;sockaddr_in新版本的TCP/IP地址家族中统一的套接字地址结构
3.2in_addr结构体的定义
struct in_addr
{
union
{
struct
{
unsigned char s_b1, s_b2, s_b3, s_b4;
} S_un_b; //--用4个u_char字符描述IP地址
struct
{
unsigned short s_w1, s_w2;
} S_un_b; //--用4个u_char字符描述IP地址
unsigned long S_addr; //--用1个u_long类型描述IP地址
} S_un;
};
Ps:通常情况下,在网络编程中使用一个u_long类型的字符进行描述IP地址即可
eg:使用IP地址结构in_addr进行描述IP地址"218.63.45.5"
sockaddr_in addr;
//--因为结构成员S_addr为网络字节顺序,所以需要调用inet_addr("218.63.45.5")将字符串"218.63.45.5"转化为网络字节顺序排列的IP地址
addr.in_addr.S_un.S_addr = inet_addr("218.63.45.5");
4.字节顺序
4.1在socket编程中,传输数据的排列顺序的主要方式:
网络字节顺序和主机字节顺序
4.2数据通过网络方式传输时,需要将数据转化为网络顺序的原因:
避免数据在传输过程中被破坏
4.3如果将网络数据储存到本地计算机,需要转化为主机字节顺序排列
4.4从数据存储来说,网络字节顺序首先存储的是数据重要的字节;而主机字节顺序首先存储的是不重要的字节顺序
5.实现线程同步
5.1线程同步的概念:
指同一个进程中多个线程相互协调工作达到一致性;避免出现同时读取和修改共享数据,导致程序异常退出
5.2实现线程同步的方法
5.2.1临界区对象
5.2.1.1临界区对象的概念:
临界区对象是指当用户使用某个线程访问共享资源时,必须使代码段独享该资源,不允许其他线程访问该资源;待该代码访问完资源后,其他程序才能对该资源进行访问
5.2.1.2临界区的使用场景:
同步代码段,即当一个线程使用一个代码段时,其他线程不可以使用该代码段;
圈定同步代码段的方法:CCriticalSection temp; temp.Lock();.....temp.Unlock();
Ps: temp.Lock()和temp.Unlock()之间的代码为同步代码段
5.3临界区,互斥量,事件和信号量的比较
类名 模式 效率 适用场景
临界区 CCriticalSection 用户模式 高 仅在同一进程的多线程使用
互斥量 CMutex 内核模式 低 线程间或进程间使用
事件 CEvent 内核模式 低 一个线程等待另一个线程完成某任务时
信号量 CSemaphore 内核模式 低 适用于允许特定个数的线程执行某任务
6.进程间通信
6.1进程通信的概念:
进程通信是指在系统中2个或2个以上的进程间通过第三方进行数据共享。
6.2进行网络通信的方法:
6.2.1使用套接字进行网络通信;
6.2.2使用进程间的通信方式实现网络通信。
6.3进程间通信的方式:
6.3.1邮槽
6.3.1.1邮槽概念:
邮槽是windows系统提供的一种单向通信机制。即进程中的一方只能写入或读取数据,而另一方则只能读取或写入数据。通过邮槽,可以实现一对多或跨网络的进程间的通信
6.3.1.2邮槽的不足
邮槽能传输的数据非常小,大约400k左右。如果用户的数据过大,可能会导致邮槽不能正常工作
6.3.2命名管道
命名管道,是一种不但能在同一机器上实现2个进程间的通信,还能在网络中不同机器上的2个进程间进行通信的机制
与邮槽不同,命名管道传输数据是采取基于连接且可靠的传输方式,只能进行一对一进行传输
6.3.3匿名管道