ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:169.91KB ,
资源ID:17271880      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17271880.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(课程设计局域网聊天程序设计Word下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

课程设计局域网聊天程序设计Word下载.docx

1、关键词: 局域网聊天;Sockets API;C/S构架;Windows MFCAbstract Gradually, real-time communicate software are changing our way of communication. No matter haw close at hand or how far by vast oceans people are separated, they just can chat between mouse and keyboard. Network chatting program has a gradual importan

2、t influence on our life.All of us are used to chatting with friends from all over the country by some popular chat tools, such as ICQ, QQ, MSN. However, these chat tools must rely on support of Internet. Without Internet, they are useless. Based on this kind of situation,do you ever thought that uni

3、t staff and dormitory roommates could enjoy the happiness of LAN chat easily without logging in Internet ? Relying on this idea, its necessary to design a kind of LAN chat tool.This article discusses how to design and develop a LAN chatting program in Windows environment. The network communication p

4、art depends on the popular TCP/IP protocol. Software is based on C/S architecture. Network communication is developed with Socket. UI is designed with Windows MFC frame. The article describes a concise chart software version, with the function of logging in/out, adding friend to list, sending/receiv

5、ing message and so on. Key words: LAN chatting;C/S architecture;Windows MFC frame引言 在网络越来越发达的今天,人们对网络的依赖性也越来越大,由此而产生的聊天工具也越来越多,如MSN、QQ、ICQ等,然而这些聊天工具如果没有了Internet的支持的话人们将无法使用他们进行聊天交流,即使通信双方在同一个局域网中也一样。本次课程设计的内容就是一种局域网聊天软件,它无需Internet的支持,可以让用户们不用出内网就能自由聊天。1 设计目的 本次课程设计运用TCP/IP、Socket多线程编程,用VC+ 6.0实现局域

6、网内多用户的聊天功能。2 功能描述 本系统是类似于QQ的局域网聊天软件,包括服务器端和客户端程序,采用TCP/IP、Socket多线程编程,主要功能有:局域网内的客户可实时进行聊天;每个客户既是聊天的发起端,又是接收端,实现了多点同时聊天。3 Windows Socket 网络编程的研究3.1 TCP/IP体系结构3.1.1 TCP/IP简介TCP/IP 作为 Internet的核心协议,通过近二十多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。TCP/IP 协议集确立了 Internet 的技术基础。TCP/IP 协议主要作用于 OSI 网络参考模型中的网络

7、层(第3层)、传输层(第4层)和应用层(第7层)。数据链路层(第2层)的功能主要应用于其它协议如以太网(Ethernet)、ATM、帧中继(Frame Relay),以及多数供应商特定协议等。TCP/IP 充分支持所有通用第2层协议。TCP/IP 组中的应用程序通常直接运行于传输层协议 TCP 或 UDP 上面,并不需要表示层(第6层)和会话层(第5层)的支持。3.1.2 TCP/IP的特点TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。因此用户一般不涉及。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;

8、二、使用以库函数方式提供的各种函数。前者为核内设计,后者为核外设计。用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。3.2 基本套接字下面给出几个基本的套接字,这些套接字的使用贯穿了网络编程的始末,主导了数据通信的过程。这将在以后的篇幅中会给出更详细的使用说明。3.2.1创建套接字socket()功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);参数:af: 通信发生的区域type: 要建立的套接字类型procotol: 使用的特定协议3.2.2指定本地地址bind()

9、将套接字地址与所创建的套接字号联系起来。int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。其它:没有错误,bind()返回0,否则SOCKET_ERROR地址结构说明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16位端口号,网络字节顺序struct in_addr sin_addr;/32位IP地址,网络字节顺序char sin_zero8;

10、/保留3.2.3建立套接字连接connect()和accept()共同完成连接工作int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);同上3.2.4监听连接listen()用于面向连接服务器,表明它愿意接收连接。int PASCAL FAR listen(SOCKET s, int backlog);3.2.5数据传输send()与r

11、ecv()数据的发送与接收int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);buf:指向存有传输数据的缓冲区的指针。 3.2.6多路复用select()用来检测一个或多个套接字状态。int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfd

12、s,const struct timeval FAR * timeout);readfds:指向要做读检测的指针writefds:指向要做写检测的指针exceptfds:指向要检测是否出错的指针timeout:最大等待时间3.2.7关闭套接字closesocket()关闭套接字sBOOL PASCAL FAR closesocket(SOCKET s)。3.3 客户机/服务器模式在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主

13、动请示方式:首先服务器方要先启动,并根据请示提供相应服务,过程如下所示:(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。(2)等待客户请求到达该端口。(3)接收到重复服务请求,处理该请求并发送应答信号。(4)返回第二步,等待另一客户请求。(5)关闭服务器。客户方:(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求。(3)请求结束后关闭通信通道并终止。3.4 WINDOWS SOCKETS程序设计3.4.1 WINDOWS SOCKETS API简介VC+对网络编程的支持有socket支持,WinInet

14、支持,MAPI和ISAPI支持等。其中,Windows Sockets API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。最早美国加州大学Berkeley分校在UNIX下为TCP/IP协议开发了一个API,这个API就是著名的Berkeley Socket接口(套接字)。在桌面操作系统进入Windows时代后,仍然继承了Socket方法。在TCP/IP网络通信环境下,Socket数据传输是特殊的I/O,它也相当于文件描述符,具有一个类似于打开文件的函数调用-socket()。可以这样理解:Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络

15、和其他的Socket应用程序通信。Socket存在于一个通信域(为描述一般的线程如何通过Socket进行通信而引入的抽象概念)里,并且与另一个域的Socket交换数据。Socket有三类。第是SOCK_STREAM(流式),提供面向连接的可靠的通信服务,比如telnet,http。第二种是SOCK_DGRAM(数据报),提供无连接不可靠的通信,比如UDP。第三种是SOCK_RAW(原始),主要用于协议的开发和测试,支持通信底层操作,比如对IP和ICMP的直接访问。3.4.2 WINDOWS SOCKETS机制(1)异步选择机制:WINDOWS SOCKETS 的异步选择函数提供了消息机制的网络

16、事件选择,当使用它登记网络事件发生时,应用程序相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。WINDOWS SOCKETS 提供了一个异步选择函数 WSAAsyncSelect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口函数将收到一个消息。函数结构如下:int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);参数说明:hWnd:窗口句柄wMsg:需要发送的消息lEvent:事件(以下为事件的内容)值: 含义:FD_READ

17、 期望在套接字上收到数据(即读准备好)时接到通知FD_WRITE 期望在套接字上可发送数据(即写准备好)时接到通知FD_OOB 期望在套接字上有带外数据到达时接到通知FD_ACCEPT 期望在套接字上有外来连接时接到通知FD_CONNECT 期望在套接字连接建立完成时接到通知FD_CLOSE 期望在套接字关闭时接到通知例如:我们要在套接字读准备好或写准备好时接到通知,语句如下:rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);如果我们需要注销对套接字网络事件的消息发送,只要将 lEvent 设置为0 。(2)异步请求函数在 Berkeley Soc

18、kets 中请求服务是阻塞的,WINDOWS SICKETS 除了支持这一类函数外,还增加了相应的异步请求函数(WSAAsyncGetXByY();)。(3)阻塞处理方法WINDOWS SOCKETS 为了设计当一个应用程序的套接字调用处于阻塞时,能够放弃CPU让其它应用程序运行,它在调用处于阻塞时便进入一个叫“HOOK”的例程,此例程负责接收和分配WINDOWS消息,使得其它应用程序仍然能够接收到自己的消息并取得控制权。WINDOWS 是非抢先的多任务环境,即若一个程序不主动放弃其控制权,别的程序就不能执行。因此在设计 WINDOWS SOCKETS 程序时,尽管系统支持阻塞操作,但还是反对

19、程序员使用该操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默认操作是阻塞的,WINDOWS 作为移植的 SOCKETS 也不可避免对这个操作支持。在 WINDOWS SOCKETS 设计中,对于不能立即完成的阻塞操作做如下处理:DLL初始化循环操作。在循环中,它发送任何 WINDOWS 消息,并检查这个 WINDOWS SOCKETS 调用是否完成,在必要时,它可以放弃CPU让其它应用程序执行(当然使用超线程的CPU就不会有这个麻烦了)。我们可以调用 WSACancelBlockingCall() 函数取消此阻塞操作。在 WINDOWS SOCKETS 中,有一个默

20、认的阻塞处理例程 BlockingHook() 简单地获取并发送 WINDOWS 消息。如果要对复杂程序进行处理,WINDOWS SOCKETS 中还有WSASetBlockingHook() 提供用户安装自己的阻塞处理例程能力;与该函数相对应的则是 SWAUnhookBlockingHook(),它用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程。请注意,设计自己的阻塞处理例程时,除了函数WSACancelBlockingHook() 之外,它不能使用其它的 WINDOWS SOCKETS API 函数。在处理例程中调用 WSACancelBlockingHook()函数将取消处

21、于阻塞的操作,它将结束阻塞循环。(4)出错处理WINDOWS SOCKETS 为了和以后多线程环境(WINDOWS/UNIX)兼容,它提供了两个出错处理函数来获取和设置当前线程的最近错误号。(WSAGetLastEror()和WSASetLastError()(5)启动与终止使用函数 WSAStartup() 和 WSACleanup() 启动和终止套接字。4 网络通信模块分析4.1 网络通信程序设计过程 图4-1 面向连接的套接字的系统调用流程图在调用了Windows sockets 的启动函数WSACleanup()之后才能进行其他的Socket系统调用,但启动函数WSAStartup()

22、是为了建立与Windows Sockets DLL的连接,因此在VC+6.0所建立工程的工程设置中的连接的库模块必须进行设置,在其中的link栏内的对象/库模块中加入“Ws2_32.lib”,才能真正建立建立与Windows Sockets DLL的连接。其他的Socket系统调用包括创建Socket、将创建的Socket与本地端口绑定、建立Socket连接服务器、监听是否有连接、请求数据的可控缓冲发送和可控缓冲接收,到最后关闭Socket。具体流程图如1所示。 首先在服务器方,利用socket()函数建立流式套接字,返回套接字号s,接着利用bind()函数将套接字s与本地地址绑定,紧接着利用

23、listen(0函数通知TCP,监听客户方,服务器准备接收连接,没有连接的话,服务器方通过closesocket()关闭套接字s,服务结束。有连接的话,在客户方,通过socket()函数建立流式套接字s,此时在服务器方,建立连接,通过accept()返回,得到新的套接字ns,客户方通过connect()将套接字s与远程地址连接,此时服务器方/客户方在ns/s上读/写数据,直到交换完成。交换完成后,服务器方/客户方关闭套接字ns/s,最后服务器方通过closesocket()关闭最初套接字s,服务结束。具体设计过程如图4-1所示,具体设计代码将会在后面介绍。4.2 网络通信程序设计核心代码分析4

24、.2.1通信设计代码分析先分析服务器端。首先定义初始化网络函数,也就是WINDOWS SOCKETS的启动在所有 WINDOWS SOCKETS 函数中,只有启动函数 WSAStartup() 和终止函数 WSACleanup() 是必须使用的。启动函数必须是第一个使用的函数,而且它允许指定 WINDOWS SOCKETS API 的版本,并获得 SOCKETS的特定的一些技术细节。本结构如下:int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);其中 wVersionRequested 保证 SOCKET

25、S 可正常运行的 DLL 版本,如果不支持,则返回错误信息。设计代码如下,主要是进行 WSAStartup()函数 的调用 WORD wVersionRequested;/ 定义版本信息变量 WSADATA wsaData;/定义数据信息变量 int err;/定义错误号变量 wVersionRequested = MAKEWORD(1,1);/给版本信息赋值 err = WSAStartup(wVersionRequested, &wsaData);/给错误信息赋值 if(err!=0) return;/告诉用户找不到合适的版本 /确认 WINDOWS SOCKETS DLL 支持 1.1

26、版本 /DLL 版本可以高于 1.1 /系统返回的版本号始终是最低要求的 1.1,即应用程序与DLL 中可支持的最低版本号 if(LOBYTE(wsaData.wVersion)!= 1| HIBYTE(wsaData.wVersion)!=1) WSACleanup(); /WINDOWS SOCKETS DLL 被进程接受,可以进入下一步操作既然启动了到最后就需要调用WSACleanup()函数来终止, 关闭函数使用时,任何打开并已连接的 SOCK_STREAM 套接字被复位,但那些已由 closesocket() 函数关闭的但仍有未发送数据的套接字不受影响,未发送的数据仍将被发送。程序运

27、行时可能会多次调用 WSAStartuo() 函数,但必须保证每次调用时的 wVersionRequested 的值是相同的。接着是创建服务器端套接字,主要代码如下:SOCKET ServerSock; /服务器端SocketServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(ServerSock = INVALID_SOCKET)MessageBox(创建套接字失败!);closesocket(ServerSock);WSACleanup();return FALSE;套接字创建好之后就是与本地地址绑定:sockaddr_in

28、localaddr;localaddr.sin_family = AF_INET;localaddr.sin_port = htons(8888); file:/端口号不要与其他应用程序冲突localaddr.sin_addr.s_addr = 0;if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr)= = SOCKET_ERROR)绑定地址失败!接下来就是对SOCKET的设置,本程序使用的数据传输模式是异步非阻塞模式,设置好之后就是监听客户端信息,主要代码如下if(WSAAsyncSelect(ServerSock

29、, m_hWnd, NETWORK_EVENT,FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) = SOCKET_ERROR)注册网络异步事件失败!listen(ServerSock, 5); /设置侦听模式return TRUE;其中m_hWnd 为应用程序的主对话框或主窗口的句柄。这就要说到网络异步函数的回调函数,主要代码内容如下:OnNetEvent(WPARAM wParam, LPARAM lParam)/调用Winsock API函数,得到网络事件类型int iEvent = WSAGETSELECTEVENT(lParam);/调用Winsock API函数,得到发生此事件的客户端套接字SOCKET CurSock= (SOCKET)wParam;switch(iEvent)case FD_ACCEPT: /

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1