基于vcsocket的多线程网络聊天系统开发与设计内容摘要:
er 的连接。 Access 主要适用于中小型应用系统,或作为客户机 /服务器系统中的客户端数据库。 基于 VC++ Socket 的多线程网络聊天系统开发与设计 5 WINDOWS SOCKETS 网络编程接口 选定 WINDOWS平台开发网络通信程序,可以选择 WINDOWS的 SOCKETS编程接口, Windows Sockets 是一套开放的、支持多种协议的 Windows 下的网络编程接口 [4]。 现在的 Winsock 已经基本上实现了与协议无关,你可以使用 Winsock来调用多种协议的功能,但较常使用的是 TCP/IP 协议。 Windows sockets 无疑是我们 进行网络编程的利器。 所有的 Windows Sockets 实现都支持流套接口和数据报套接口。 应用程序调用 Windows Sockets 的 API 实现相互之间的通讯。 Windows Sockets 又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。 它们之间的关系如图 所示 [5]: 应 用 程 序 1网 络 编 程 界 面 , 例 如 w i n d o w s S c o k e t s应 用 程 序 2操 作 系 统 , 例 如 w i n d o w s物 理 通 讯 介 质网 络 通 信 协 议 服 务 界 面 , 例 如 T C P / I P 图 Windows Sockets 实现通讯工作的各层关系图 Windows Sockets 编程的一般流程如下 : (1) Winsock 的初始化 [6] 每个 Winsock 应用都必须加载 Winsock DLL 的相应版本。 如果调用 Winsock之前,没有加载 Winsock 库,这个函数就会返回一个 SOCKET_ERR,错误信息是 WSANOTINITIALISED。 加载 Winsock库是通过调用 WSAStartup函数实现的。 这个函数的定义如下: int WSAStartup(WORD wVersionRequested , LPWSADATA lpWSAData)。 (2) 创建套接字 SOCKET socket(int af, int type, int protocol)。 (3) 把套接字和准备接收数据的地址、接口绑定在一起 int bind (SOCKET s, const struct sockaddr FAR *name, int namelen)。 基于 VC++ Socket 的多线程网络聊天系统开发与设计 6 (4) 发送数据 int sendto ( SOCKET s, //一个可用的 SOCKET const char FAR *buf, //需要传输的数据 int len, //传输数据的长度 int flags, //标记 const struct sockaddr FAR *to, //指向存有目的 ip 和端口的结构体 int tolen //目的地址的长度 )。 (5) 接收数据 int recvfrom (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen)。 (6) 关闭套接字 多线程开发技术 多线程在构建大型系统 的时候是需要重点关注的一个重要方面,特别是在效率(系统跑得多快。 )和性能(系统工作正常。 )之间做一个权衡的时候。 恰当的使用多线程可以极大的提高系统性能。 使用多线程的好处有以下几点 [7]: 使用线程可以把占据长时间的程序中的任务放到后台去处理; 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度; 程序的运行速度可能加快; 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。 在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 线程是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应于 Visual C++中的 CwinThread 类对象。 单独一个执行程序运行时,缺省地包含的一个主线程,主线程以函数地址的形式出现,提供程序的启动点,如 main()或 WinMain()函数等。 当主线程终止时,进程也随之终止。 根据实际需要,应用程序可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。 线程被分为两种:用户界面线程和工作线程(又称为后台线程)。 用户界面线程 通常用来处理用户的输入并响应各种事件和消息,其实,应用程序的主执行线程 CWinAPP 对象就是一个用户界面线程,当应用程序启动时自动创建和启动,同样它的终止也意味着该程序的结束,进程终止。 工作线程用来执行程序的后台处理任务,比如计算、调度、对串口的读写操作等,它和用户界面线程的区别是它不用从 CWinThread 类派生来创建,对它来说最重要的是如何实现工作线程任务的运行控制函数。 工作线程和用户界面线程启动时要调用同一个函数的基于 VC++ Socket 的多线程网络聊天系统开发与设计 7 不同版本 , 一个进程中的所有线程共享它们父进程的变量,但同时每个线程可以拥有自己的变量 [8]。 在 MFC 中,一般用全局函数 AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程 [9]。 两种重载函数原型和参数分别说明如下: (1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL)。 PfnThreadProc:指向工作者线程的执行函数的指针,线程函数原型必须声明如下: UINT ExecutingFunction(LPVOID pParam)。 请 注意, ExecutingFunction()应返回一个 UINT 类型的值,用以指明该函数结束的原因。 一般情况下,返回 0 表明执行成功。 pParam:传递给线程函数的一个 32 位参数,执行函数将用某种方式解释该值。 它可以是数值,或是指向一个结构的指针,甚至可被忽略; nPriority:线程的优先级。 如为 0,则线程与其父线程具有相同优先级; nStackSize:线程为自己分配堆栈的大小,其单位为字节。 如果 nStackSize 被设为 0,则线程的堆栈被设置成与父线程堆栈相同大小; dwCreateFlags:如果为 0,则线程在创建后立刻开始执行。 如果为 CREATE_SUSPEND,则线程在创建后立刻被挂起; lpSecurityAttrs:线程的安全属性指针,一般为 NULL; (2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, Int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL)。 pThreadClass 是指向 CWinThread 的一个导出类的运行时类对象的指针,该导出类定义了被创建的用户界面线程的启动、退出等;其它参数的意义同形式1。 使用函数的这个原型生成的线程也有消息机制,在以后的例子中我们将发现同主线程的机制 几乎一样。 下面我们对 CWinThread 类的数据成员及常用函数进行简要 的介绍: m_hThread:当前线程的句柄; m_nThreadID:当前线程的 ID; m_pMainWnd:指向应用程序主窗口的指针; BOOL CWinThread::CreateThread(DWORD dwCreateFlags=0, UINT nStackSize=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL)。 该函数中的 dwCreateFlags、 nStackSize、 lpSecurityAttrs 参数和 API 函数基于 VC++ Socket 的多线程网络聊天系统开发与设计 8 CreateThread 中的对应参数有相同含义,该函数执行成功,返回非 0 值,否则返回 0。 一般情况下,调用 AfxBeginThread()来一次性地创建并启动一个线程,但是也可以通过两步法来创建线程:首先创建 CWinThread 类的一个对象,然后调用该对象的成员函数 CreateThread()来启动该线程。 virtual BOOL CWinThread::InitInstance()。 重载该函数以控制用户界面线程实例的初始化。 初始化成功则返回非 0 值,否 则返回 0。 用户界面线程经常重载该函数,工作者线程一般不使用InitInstance()。 在线程终结前重载该函数进行一些必要的清理工作。 该函数返回线程的退出码, 0 表示执行成功,非 0 值用来标识各种错误。 TCP/IP 协议、 UDP 协议 因特网在传输层有两种主要的协议:一种是面向连接的协议,一种是无连接的协议。 传输控制协议 TCP 是 (transmission control protocol)专门用于在不可靠的因特网上提供可靠的、端对端的字节流通信的协议。 通过在发送方和接收方分别创建一个称为套接字的通 信端口就可以获得 TCP 服务。 所有的 TCP 连接均是全双工的和点到点的。 TCP 协议在 IP 协议之上。 与 IP 协议提供不可靠传输服务不同的是, TCP 协议为其上的应用层提供了一种可靠传输服务。 这种服务的特点是:可靠、全双工、流式和无结构传输。 它是通过一下步骤来实现可靠传输的: TCP 协议使用了一个叫积极确认和重发送 (positive acknowledgement with retransmission)的技术来实现这一点的。 接收者在收到发送者发送的数据后,必须发送一个相应的确认( ACK)消息,表示它已经收到了数据。 发送者保存发送的数据的记录,在发送下一个数据之前,等待这个数据的确认消息。 在它发送这个数据的同时,还启动了一个记时器。 如果在一定时间之内,没有接收到确认消息,就认为是这个数据在传送时丢失了,接着,就会重新发送这个数据。 网际协议 IP 是 TCP/IP 的心脏,也是网络层中最重要的协议。 IP,全称 Inter Protocol(因特网协议),它工作在网络层,它负责将数据传输到正确的目的地,同时也负责路由。 无论传输层使用何种协议,都要依赖 IP来发送和接收数据。 IP 提供一种无连接的传输机制,这就意味着在网络传输的每个数据报都作为独立的单元来对待。 IP 并不维护服务器和客户端之间的连接细节,并且 IP 不能保证数据传输的可靠性。 然而,这些并不意味着分组将被毫无规则的忽略,而是仅在网络出现故障时才会发生数据丢失。 IP 层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层 TCP 或 UDP 层;相反, IP 层也把从 TCP 或 UDP基于 VC++ Socket 的多线程网络聊天系统开发与设计 9 层接收来的数据包传送到更低层。 IP 数据包是不可靠的,因为 IP 并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。 IP 数据包中含有发送它的主机的地址(源地址)和接收 它的主机的地址(目的地址)。 如果 IP 数据包中有已经封好的 TCP 数据包,那么 IP 将把它们向 „上 ‟传送到TCP 层。 TCP 将包排序并进行错误检查,同时实现虚电路间的连接。 TCP 数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 UDP 与 TCP 位于同一层,但对于数据包的顺序错误或重发。 因此, UDP 不被应用于那些使用虚电路的面向连接的服务, UDP 主要用于那些面向查询 应答的服务。 TCP 和 UDP 服务通常有一个客户 /服务器的关系。 两个系统间的多重连接是这样 相互确认并协调一致 的, TCP 或 UDP 连接唯一地使用每个信息中的如下四项进行确认: 源 IP 地址 : 发送包的 IP 地址。 目的 IP 地址 : 接收包的 IP 地址。 源端口 : 源系统上的连接的端口。 目的端口 : 目的系统上的连接的端口。 端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。 一个端口对应一个 16 比特的数。 服务进程通常使用一个固定的端口,例如, SMTP 使用 25。 这些端口号是 确定 的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。 C/S 模式(客户机 /服务器模式) C/S 模式 是大家熟知的客户。基于vcsocket的多线程网络聊天系统开发与设计
相关推荐
程序流程图 程序初始化的实现 // CA11Dlg dialog CA11Dlg::CA11Dlg(CWnd* pParent /*=NULL*/) : CDialog(CA11Dlg::IDD, pParent) 8 { //{{AFX_DATA_INIT(CA11Dlg) m_PL =。 m_ZQS = 0。 m_FZ =。 //}}AFX_DATA_INIT // Note that
图 路 标识别流程图 本文的研究方面 本文研究的是自然场景下交通标志牌的检测与识别,它是通过安装在车辆上的摄像机来获取室外的交通标志,将所获取的交通标志图像送入计算机,通过计算机来完成交通标志的快速检测与识别。 所有的交通标志牌都处于自然场景下,所受到的干扰较多,主要有以下几个方面: (1)光照影响。 由于晴天、雨天、雾天,还有雪天等等不同的自然环境下,图像所获得的光照条件是不同的
大学 \毕业设计 0 \ b ys j .d db D r a w n B y:E A / V P31X119X218R E S E T9RD17WR16I N T 012I N T 113T014T115P 101P 112P 123P 134P 145P 156P 167P 178P 0039P 0138P 0237P 0336P 0435P 0534P 0633P 0732P 2021P
通过以机构γ wmin 最大为寻优目标函数对机构进行优化设计,分析了速比系数对曲柄滑块机构工作行程传动性能的影响,给出了相应设计参数。 工作行程最小传动角γ wmin 曲柄转向与滑块工作行程方向的合理配置 在 下图 所示的曲柄滑块机构设计原理图中, 1l ,2l 分别为曲柄 AB 、连杆 BC 的长度, e 为偏距, H为滑块行程。 许多文献中已阐述了以下结论:曲柄位于 AB0 时
() 取得当前定单信息 NewOrder() 生成新定单对象 ModifyOrder() 修改 /删除当前定单,该方法由 SelfConfigurationWindow 或者由用户使用 StandardComputerWindow 类调用。 SetOrderStatus() 设置定单状态,由 OrderServerWindow 类的 ModifyOrderStatus方法调用