C语言聊天室
基于 tcp 实现群聊功能,本项目设计是在「windows环境下基于套接字(Socket)和多线程编程」进行开发的「简易聊天室」,实现了群聊功能,在VC6.0和VS2019运行测试无误。
运行效果
聊天室
分析设计
Windows下基于windows网络接口Winsock的通信步骤为「WSAStartup 进行初始化」-->「socket 创建套接字」-->「bind 绑定」-->「listen 监听」-->「connect 连接」-->「accept 接收请求」-->「send/recv 发送或接收数据」-->「closesocket 关闭 socket」-->「WSACleanup 最终关闭」。
通信流程
了解完了一个 socket 的基本步骤后我们了解一下多线程以及线程的同步。
多线程
线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源。一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。「简而言之多线程是为了提高系统的运行效率。」
Win32 API下的多线程编程 也就是两个函数的应用以及,具体案例这里不多做介绍。
线程的同步
每个线程都可以访问进程中的公共变量,资源,所以「使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性」。数据之间的相互制约包括
1、「直接制约关系」,即一个线程的处理结果,为另一个线程的输入,因此线程之间直接制约着,这种关系可以称之为同步关系
2、「间接制约关系」,即两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步
windows线程间的同步方式有四种:「临界区、互斥量、信号量、事件。」
本项目是基于事件内核对象实现的线程同步,事件内核对象是一种抽象的对象,有受信和未授信两种状态,通过等待实现线程同步。事件内核对象的使用流程如下:
「创建事件内核对象」
「设置内核对象状态」
「堵塞等待事件内核对象直到事件内核对象的状态为受信」
领取专属 10元无门槛券
私享最新 技术干货