基于TCP的CS模式程序设计Word下载.docx
- 文档编号:16840929
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:16
- 大小:160.95KB
基于TCP的CS模式程序设计Word下载.docx
《基于TCP的CS模式程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于TCP的CS模式程序设计Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
客户端采用P2P方式实现消息传递,并能实现文件的传输。
本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;
然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。
本课题目标是实现局域网用户之间的即时交流和文件传输,通过基础的网络SOKET编程,为局域网内部的即时通信提供一个简单而较安全的解决方案。
1.2题目开发背景
即时通信是一个终端连往一个即时通信网路的服务。
即时通信不同于e-mail在于它的交谈是实时的。
大部分的即时通信服务提供了presence
awareness的特性──显示联络人名单,联络人是否在在线与能否与联络人交谈。
最早的即时通信软件是ICQ,ICQ是英文中I
seek
you的谐音,意思是我找你。
四名以色列青年于1996年7月成立Mirabilis公司,并在11月份发布了最初的ICQ版本,在六个月内有85万用户注册使用。
在因特网上受欢迎的即时通信服务包含了MSN
Messenger、AOL
Instant
Messenger、Yahoo!
Messenger、NET
Messenger
Service、Jabber、ICQ与QQ。
这些服务有赖于许多想法更久的(与普遍)的在线聊天媒介,如Internet
Relay
Chat一样知名。
1970年代早期,一种更早的即时通信形式是柏拉图系统(PLATO
system)。
之后在1980年代,UNIX/Linux的交谈实时信息被广泛的使用于工程师与学术界,1990年代即时通信更跨越了因特网交流。
1996年11月,ICQ是首个广泛被非UNIX/Linux使用者用于因特网的即时通信软件。
在ICQ的介绍之后,同时在许多地方有一定数量的即时通信方式发展,且各式的即时通信程序有独立的协议,无法彼此互通。
这引导使用者同时执行两个以上的即时通信软件,或者他们可以使用支持多协议的终端软件,如Gaim、Trillian或Jabber。
近年来,许多即时通信服务开始提供视讯会议的功能,网络电话(VoIP),与网络会议服务开始整合为兼有影像会议与实时信息的功能。
于是,这些媒体的分别变的越来越模糊。
1.2
国内外研究现状
1.2.1
国外研究现状
当今,国际上对网络通信系统研究的较好的公司有,思科,Sun,Ms等公司,思科主要研究的是底层的传输;
MS,Sun公司研究的是应用层。
其中ms公司凭借其在操作系统的垄断地位,为了在网络的发展中取得先机,采用了各种各样的手段。
但是,其捆绑的msn,无论从功能上,还是技术上来说,都不算是非常先进的。
当然,ie,同样也不是很受人青睐,这让人想起了,当年的网景公司,网景只是生不逢时。
MS不择手段的想打跨网景,可见其对网络的重视。
如今,Sun公司在网络应用上捷足先登,凭借着Java,Sun在网络的应用上领先于MS。
微软,想用同样的办法搞跨对手,因此它拿出了Visual
c#,来对抗Java。
这些都是在应用层面的开发工具。
应用层上的产品就更显种类繁多。
ICQ几乎是国际上通用的即时通信工具,由于在我国它的应用不是很广,所以,其原理也很少被介绍。
msn,是MS的产品,同样在国内没什么市场,所以,对其原理,也很少被讨论过。
至于ie,是在Visual
c++下开发的产品,虽然有严重的安全隐患,不过,至少能在某种程度上代表当今国际研究的水平。
此外,国际上最近出先了新的浏览器Firefox,其性能据说是远高于ie,也许在网络的天下,Ms又有了更强劲的对手。
1.2.2
国内研究现状
国内在应用层上的网络应用软件目前发展异常的火爆,因为我国有着网络应用的最大的市场,现在国内网络的基础性建设发展迅速,应用软件也层出不穷,其中,在游戏的领域中,网络通信的工作做的不错,如联众游戏平台,还有其他的一些平台,这些平台基本上都是基于VC++的,用的都是Socket通信,但是为了效率,这些平台没有用MFC提供的CSocket类,而是直接用Socket进行通信。
所以效率上不错。
此外,tencent的即时通信,也是做的很好的,从某中程度上来说,代表了国内最高的水平。
1.3TCP/IP体系结构
TCP/IP的中文译名为传输控制协议/网际协议,又叫网络通讯协议,这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP协议并不完全符合OSI的七层参考模型。
传统的开放式系统互连参考模型,是一种通信协议的七层抽象的参考模型,其中每一层执行某一特定任务。
该模型的目的是使各种硬件在相同的层次上互相通信。
这七层是:
物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
而TCP/IP通讯协议采用了四层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求,如下图所示。
图1计算机网络体系结构
应用层:
应用程序间沟通的层,如简单电子邮件传输(SMTP),文件传输协议(FTP),网络远程访问协议(Telnet)等。
传输层:
在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化,数据确认和丢失、重传等。
如传输控制协议(TCP),用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被传送并到达接收。
网络层:
负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否正确而接收),如网际协议(IP)。
网络接口层:
接收IP数据包并进行传输,从网络上接收物理帧,抽取IP数据报转交给上一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet)来传送数据。
1.4TCP传输
图2TCP连接中分组交换以及客户端与服务器的状态转换
TCP协议在IP协议之上,提供可靠的传输服务。
这种服务的特点:
可靠、全双工、流式和无结构传输。
TCP协议使用了积极确认和重传送的技术来实现可靠传输。
接收者在收到发送者发送的数据后,必须发送一个相应的确认(ACK)消息,表示他已经收到数据。
发送者保存发送的数据的记录,在发送下一个数据之前等待这个数据的确认消息在他发送这个数据的同时,启动了一个计时器。
在一定时间内没有接收到确认消息,就认为这个数据在传输过程中丢失了,接着就会发送这个数据。
同时TCP实体又采用了滑动窗口协议。
当发送方传送一个数据报到达目的地时,接收方的TCP实体向发送方发送一个数据报,其中包含一个确认序号,它等于希望收到的下一个数据报的顺序号。
建立了一个TCP连接,需要三次握手过程,连接才能成功建立,如图二所示。
握手过程的第一段的代码位设置为SYN,序号为J,表示开始一次握手。
接收方收到此报文断后,向发送方回发一个报文段,代码位为SYN和ACK,序号为K,确认序号为J+1,表示接收方同意建立此连接。
发送者收到此报文段后,发送ACK建立连接,完成三次握手以后,双方就开始正式传送数据。
在通信完成阶段,两方通过四次断开来释放连接,如图二,客户端请求释放连接,发送有效位为FIN,服务器端给一个确认信号,若服务器端没有数据发送,便向客户端发送FIN请求,客户端对此回应,等待2MSL,彻底断开连接。
1.5C/S模式
鉴于此次设计目的,采用Linux环境下使用TCP实现点到点的可靠连接,实现基于TCP/IP协议的面向连接的通信,连接双方分为客户端和服务器端,主要实现过程如图3所示。
图3TCP客户/服务器的套接字连接
TCP套接字编程中,服务器实现的步骤:
(1)使用socket()函数创建套接字。
(2)将创建的套接字绑定到指定的地址结构。
(3)Listen()函数设置套接字为监听模式,使服务器进入被动打开的状态。
(4)接受客户端的连接请求,建立连接。
(5)接收、应答客户端的数据请求。
(6)终止连接。
客户端实现的步骤:
(2)调用connect()函数建立一个与TCP服务器的连接。
(3)发送数据请求,接收服务器的数据应答。
(4)终止连接。
综上所述,TCP/IP应用中的服务器必须先于客户端进程启动,直到对客户端的响应结束或强迫终止。
二.系统原理
2.1开发配置环境简介
CodeBlocks安装,和普通安装一样,你不会选择可以一直next完成,不做详细叙述。
注意:
当中有一步让你选择编译器,你可以选择GUNGCCCompiler,并设置位默认(default)。
如果没做也没事儿,可以在编译器(Compiler)设置进行设置。
GTK+配置安装GTK解压gtk+bundle_2.24.10-20120208_win32.zip到C:
\gtk+。
也可以是别处,你个人喜好,随便哪儿都行。
配置环境变量添加“C:
\gtk+\bin”到系统环境变量(path)注意:
GTK解压的位置不同,你相应变一下就行了。
导出编译库信息导出编译库信息,一会儿要在Code:
:
Blocks上配置编译、链接环境。
pkg-config--cflagsgtk+-2.0>
cflags.txtcflags.txtpkg-config--libsgtk+-2.0>
libs.txtlibs.txt还是那句话,安装位置不同,内容不同,不要直接从我这里拷贝。
配置Code:
Blocks编译链接环境菜单上依次点击:
Settings--Compilersettings会出现Compilersettings设置窗口:
a.此处把cflags.txt内容复制至文本框
2.2开发工具及技术简介
DevC:
Dev-C++是一个C&
C++开发工具,它是一款自由软件,遵守GPL协议。
它集合了GCC、MinGW3等众多自由软件,并且可以取得最新版本的各种工具支持,而这一切工作都是来自全球的狂热者所做的工作,并且你拥有对这一切工具自由使用的权利,包括取得源代码等,前提是你也必须遵守GNU协议。
Dev-C++每一天都在进步着,因为它是一个自由软件。
Dev-C++是一个非常实用的编程软件,多款著名软件均由它编写而成,它在C的基础上,增强了逻辑性。
发展
C++是从C语言中发展而来的。
C语言是1972年由美国贝尔实验室(AT&
TBell)的D.M.Ritchie研制成功的。
它不是为了初学者设计的,而是为计算机专业人员设计的。
最初它是作为写UNIX操作系统的一种工具,在贝尔实验室内部使用。
后来C语言不断改进,人们发现它功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多优点,特别适合于写系统软件,因此C语言从实验室走向美国,从美国走向世界。
到20世纪70年代,它已风靡全世界。
无论是在中国还是在外国,C语言都成为了计算机开发人员的基本功。
为了解决软件设计的危机,在20世纪80年代,人们提出了面向对象的程序设计(object
oriented
programming,OOP),需要设计出能支持面向对象的程序设计方法的新的语言。
在实践中,人们发现由于C语言是如此的深入人心,使用如此广泛,面对程序设计方法的革命,最好的办法不是另外发明一种语言去代替它,而是在它原有的基础上加以发展。
在这种形式下,C++应运而生。
C++是由贝尔实验室(AT&
TBell)的Bjarne
Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的。
AT&
TBell发布的第一个Dev-C++编译系统实际上是一个预编译器(前端编译器),真正的Dev-C++程序是在1988年诞生的。
应用
Dev-C++目前是NOI、NOIP等比赛的指定工具,唯一的缺点就是Debug功能较弱。
Codeblocks:
它是基于wxWidget库的程序。
首先,因为它就是用C++开发的,所以在速度上明显比Eclipse快。
其次,因为是一个专门的C++IDE,所以在配置方面也非常符合C++开发的习惯,功能几乎可以和VC2005/2007媲美。
最后,它还是一个开源的IDE,并且它的体积比Eclipse和VC小了不止一个数量级——整个压缩后的源码包只有6M多!
其实说实话,我也是刚开始用Code:
Blocks,但是我敢负责任的说,它真的很好。
以前编程和调试都一直在VIM、Emacs和gdb里挣扎,命令方式的GDB调试把握折腾的都崩溃了。
突然接触了Code:
Blocks以后,马上让我找到了当前用VC编程和调试的快乐的感觉。
就是前几天,我在GDB下调试一个C++程序时的不便,尝试了DDD还是觉得不方便,于是偶然间试了一下Code:
Blocks,一会的时间问题就解决了。
虽然它使用的还是GCC+GDB,但是它对其包装以后使我使用起来感到了极大的方便
2.3相关协议及结构介绍
套接字套接字这个术语并没有定义某个协议:
它具有两层含义,但两者都与一个协议相关。
第一个含义是套接字编程API,它最初由伯克利大学为BSDUNIX而创建。
BSD套接字在经过修改后被用作Windows环境的编程接口(并且被命名为WinSock)。
WinSockAPI被包装在System.Net.sockets命名空间的.NET类中。
WindowsSockets是一个独立于协议的编程接口,用于编写网络应用程序。
套接字的第二层含义表示一个用于在进程间进行通信的终端。
在TCP/IP中,每个终端都与一个IP地址和一个端口号绑定。
我们必须对流式套接字和数据报套接字这两种类型进行区分。
流失套接字用TCP/IP协议来使用面向连接的通信;
另一方面,数据报套接字用UDP/IP来使用无连接通信。
即时通信协议协议是一系列的步骤,它包括双方或者多方,设计它的目的是要完成一项任务。
即时通信协议,参与的双方或者多方是即时通信的实体。
协议必须是双方或者多方参与的,一方单独完成的就不算协议。
这样在协议动作的过程中,双方必须交换信息,包括控制信息、状态信息等等。
这些信息的格式必须是协议参与方同意并且遵循的。
好的协议要求清楚,完整,每一步都必须有明确的定义,并且不会引起误解;
对每种可能的情况必须规定具体的动作。
有许多的IM系统,如AOLIM、YahooIM和MSNIM,它们使用了不同的技术,而且它们互不兼容。
为了创建即时通信的统一标准,人们经过了多次尝试:
IETF的对话初始协议(SIP)和即时通信对话初始协议和表示扩展协议
三.系统设计
1.服务器端等待客户端请求连接,连接成功后,接收客户端信息并显示,然后接收来自客户的信息(字符串),将字符串反转并将结果送回客户端。
服务器可同时处理多个客户端的请求,准确区分每个用户的信息。
图6服务器端的程序流程图
2.客户端与服务器相连接,用户输入客户的名称并发给服务器,然后向服务器发送字符串,接收服务器返回的经处理的字符串,并显示。
四.系统实现及详细设计
4.1系统详细设计
1先打开服务器端,再打开客户端,客户端向服务器端发送请求进行三次握手,客户端显示回执信息Helloclient,客户端和服务器端连接成功。
2客户端向服务器端发送问候语,服务器端就收后发送回执信息,客户端可以和服务器端进行通信。
3服务器端向客户端发送信息,实现双向通信,即客户端可以向服务器端发送连接请求,服务器端可以进行回执信息的发送。
4服务器端断开连接请求:
客户端断开连接请求:
五.总结
基于TCP/IP协议和套接字编程原理为服务器端完成基本数据配置,主要采用套接字编程原理,通过调试运行并且经过完善后,实现并发服务器的功能。
六.心得体会
系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。
通过这次的课程设计,对网络编程有了更深入的了解,进一步熟悉了TCP和UDP协议的内容,由于时间有限,该课程设计部分功能并未实现,例如用fork()调用子进程,实现并发服务器。
还有客户端输入IP地址及端口号来进行连接的功能并未实现,希望在以后的学习生活中将这些功能意义实现,完成全部功能的实现。
七.致谢
这次课程设计郭老师指导了很多,从算法原理到计算机原理知识都一并拓展,我受益颇多,感谢郭老师在这次课程设计中的指导和栽培,祝老师工作顺利、身体健康。
八.参考文献:
[1]梁亚声等.计算机网络安全教程.第2版.北京:
机械工业出版社,2008
[2]刘文涛.网络安全编程技术与实例.北京:
机械工业出版社2008
附录
附录核心程序代码
客户端核心代码:
#include<
stdio.h>
winsock2.h>
#pragmacomment(lib,"
ws2_32"
)
intmain(intargc,char*argv[])
{
WSADATAwsaData;
charbuf[1000];
WSAStartup(MAKEWORD(2,2),&
wsaData);
SOCKETs=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_insockAddr;
sockAddr.sin_family=PF_INET;
sockAddr.sin_addr.S_un.S_addr=inet_addr("
127.0.0.1"
);
sockAddr.sin_port=htons(827);
connect(s,(SOCKADDR*)&
sockAddr,sizeof(SOCKADDR));
charszBuffer[MAXBYTE]={0};
recv(s,szBuffer,MAXBYTE,0);
printf("
szBuffer=%s\r\n"
szBuffer);
intnum;
while
(1){
scanf("
%s"
buf);
send(s,buf,100,0);
if((num=recv(s,buf,1000,0))==-1){
recv()error\n"
break;
}
closesocket(s);
WSACleanup();
return0;
}
服务器端核心代码:
#include<
WSADATAwsaData;
charbuf[1000];
WSAStartup(MAKEWORD(2,2),&
SOCKETs=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_insockaddr;
sockaddr.sin_family=PF_INET;
sockaddr.sin_addr.S_un.S_addr=inet_addr("
sockaddr.sin_port=htons(827);
bind(s,(SOCKADDR*)&
sockaddr,sizeof(SOCKADDR));
listen(s,1);
SOCKADDRclientAddr;
intnSize=sizeof(SOCKADDR);
SOCKETclientSock;
clientSock=accept(s,(SOCKADDR*)&
clientAddr,&
nSize);
send(clientSock,"
Helloclient\r\n"
strlen("
)+sizeof(char),0);
if((num=recv(clientSock,buf,1000,0))==-1){
printf("
break;
}
printf("
%s\n"
send(clientSock,"
serverhasreceivedthemessage\n"
100,0);
scanf("
send(clientSock,buf,100,0);
)+sizeof(char
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TCP CS 模式 程序设计