计算机网络课程设计报告-利用Winsock实现双机通信_第1页
计算机网络课程设计报告-利用Winsock实现双机通信_第2页
计算机网络课程设计报告-利用Winsock实现双机通信_第3页
计算机网络课程设计报告-利用Winsock实现双机通信_第4页
计算机网络课程设计报告-利用Winsock实现双机通信_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告2014—2015学年第一学期课程名称计算机网络设计题目利用Winsock实现双机通信TOC\o"1-2"\h\u2555一、摘要 27362二、目的和要求 222665三、开发环境简介 213203(一)、VisualC++6.0简介 230536(二)、VisualC++6.0主要组成 228129四、TCP/IP简介 317500(一)、TCP/IP简介 321453(二)、TCP作用 426563五、WinSock简介 413361(一)、什么是socket 42147(二)、WinSocket的通信原理 510253(三)、基本套接字 523101六、设计方案 77764(一)、WinSocket通信的步骤: 722411七、程序代码 96945(一)、服务器端代码 917309(二)、客户端代码 1128064八、运行结果 1319875九、课程设计的总结体会 1331275十、参考文献 14利用socket实现双机通信摘要Socket通信机制提供了两种通信方式:有连接(TCP)和无连接方式(UDP),分别面线不同的应用需求。使用有连接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下,通信双方必须必须创建一个联接过程并建立一条通信链路,以后的网络通信操作完全在这一对进程之间进行,通信完毕关闭此联接过程。使用无连接方式时其系统开销比有连接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通信链路,网络通信操作在不同的主机和进程之间转发进行。关键字:Winsock、TCP、VC++、双机通信目的和要求利用WinSock来实现双机通信,理解TCP状态机图。要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。开发环境简介(一)、VisualC++6.0简介VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。VisualC++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0。所以实际中,更多的是以VisualC++6.0为平台。VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。(二)、VisualC++6.0主要组成DeveloperStudio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“MicrosoftVisualC++”,所以很多人理所当然的认为,那就是VisualC++了。其实不然,虽然DeveloperStudio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,DeveloperStudio并不是专门用于VC的,它也同样用于VB,VJ,VID等VisualStudio家族的其他同胞兄弟。所以不要把DeveloperStudio当成VisualC++,它充其量只是VisualC++的一个壳子而已。这一点请切记!MFC。从理论上来讲,MFC也不是专用于VisualC++,BorlandC++,C++Builder和SymantecC++同样可以处理MFC。同时,用VisualC++编写代码也并不意味着一定要用MFC,只要愿意,用VisualC++来编写SDK程序,或者使用STL,ATL,一样没有限制。不过,VisualC++本来就是为MFC打造的,VisualC++中的许多特征和语言扩展也是为MFC而设计的,所以用VisualC++而不用MFC就等于抛弃了VisualC++中很大的一部分功能。但是,VisualC++也不等于MFC。PlatformSDK。这才是VisualC++和整个VisualStudio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,PlatformSDK是以MicrosoftC/C++编译器为核心(不是VisualC++,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到DeveloperStudio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成VisualStudio的基石。TCP/IP简介(一)、TCP/IP简介TCP/IP(TransmissionControlProtocol/InternetProtocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。TCP(TransmissionControlProtocol)中文称为“传输控制协议”。TCP是一种面向连接的、可靠的、基于字节流的运输层(Transportlayer)通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能(UDP)是同一层内另一个重要的传输协议。IP是英文InternetProtocol的缩写,中文称为“网际协议”,是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守,IP协议就可以与因特网互连互通。、TCP作用在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。提供可靠的、像管道一样的连接。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段,通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK),如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据,假设丢失了,将会被重传。TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。首先,TCP建立连接之后,通信双方都同时可以进行数据的传输。其次,TCP通信是全双工的,在保证可靠性上,采用超时重传和捎带确认机制。在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。在拥塞控制上,采用慢启动算法。TCP所提供服务的主要特点有:1、面向连接的传输;2、端到端的通信;3、高可靠性、确保传输数据的正确性,不出现丢失或乱序;4、全双工方式传输;5、采用字节流方式,即以字节为单位传输字节序列;6、紧急数据传送功能。五、WinSock简介(一)、什么是socket所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。最重要的是,socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket系统调用。客户随机申请一个socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket半相关为全局所公认非常重要。不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。(二)、WinSocket的通信原理WinSock是一个基于Socket模型的API。WinSock在Windows98,WindowNT中使用。WinSock一般由两部分组成:开发组件和运行组件。开发组件是供程序员在windows环境下开发网络应用程序使用的,它包括应用程序接口库函数、头文件和实现的文档,其中最主要的是WINSOCK.H运行组件是以动态链接库(DlL)来实现socket接口的。文件名为WINSOCK.DLL应用程序在执行时装入它就能实现网络通信功能、基本套接字1、创建套接字——socket()

功能:使用前创建一个新的套接字

格式:SOCKETPASCALFARsocket(intaf,inttype,intprocotol);

参数:af:通信发生的区域

type:要建立的套接字类型

procotol:使用的特定协议

2、指定本地地址——bind()

功能:将套接字地址与所创建的套接字号联系起来。

格式:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);

参数:s:是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。

其它:没有错误,bind()返回0,否则SOCKET_ERROR

地址结构说明:

structsockaddr_in

{

shortsin_family;//AF_INET

u_shortsin_port;//16位端口号,网络字节顺序

structin_addrsin_addr;//32位IP地址,网络字节顺序

charsin_zero[8];//保留

}

3、建立套接字连接——connect()和accept()

功能:共同完成连接工作

格式:intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);

SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*name,intFAR*addrlen);

参数:同上

4、监听连接——listen()

功能:用于面向连接服务器,表明它愿意接收连接。

格式:intPASCALFARlisten(SOCKETs,intbacklog);

5、数据传输——send()与recv()

功能:数据的发送与接收

格式:intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);

intPASCALFARrecv(SOCKETs,constcharFAR*buf,intlen,intflags);

参数:buf:指向存有传输数据的缓冲区的指针。6、多路复用——select()

功能:用来检测一个或多个套接字状态。

格式:intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);

参数:readfds:指向要做读检测的指针

writefds:指向要做写检测的指针

exceptfds:指向要检测是否出错的指针

timeout:最大等待时间7、关闭套接字——closesocket()

功能:关闭套接字s

格式:BOOLPASCALFARclosesocket(SOCKETs);六、设计方案(一)、WinSocket通信的步骤:1、在服务器端的应用程序中的网络通信的步骤如下:(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接,再继续进入监听状态。(3)在监听的过程中,如果有用户发出了请求,则服务器会产生一个新的连接Socket来处理用户的请求,而原来的Socket仍然会进行监听操作。(4)当完成通信后,服务器关闭与客户端的Socket连接。2、在客户端应用程序中的网络通信的步骤如下:(1)建立一个客户端的Socket。(2)从命令行中得到服务器的名字,并进行查询以得到服务器的IP地址;(3)从命令行中得到服务器所提供的端口号,以便进行下一步的操作;(4)发送连接请求到服务器,并等待服务器的回馈信息。(5)连接成功后,与服务器进行数据的交互。(6)数据处理完毕后,关闭自身的Socket连接,释放进行连接所分配的资源,客户端的程序运行完毕。(二)、系统实现的过程图七、程序代码(一)、服务器端代码#include<stdio.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32.lib")intmain(){WSADATAwsaData; WSAStartup(MAKEWORD(2,2),&wsaData);//创建套接字SOCKETListen_sk;Listen_sk=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(Listen_sk==INVALID_SOCKET){printf("Failedsocket!\n");return0;}//填充sockaddr_in结构sockaddr_insin;sin.sin_family=AF_INET;sin.sin_port=htons(4567);sin.sin_addr.S_un.S_addr=INADDR_ANY;//绑定这个套接字到一个本地地址if(bind(Listen_sk,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR){printf("Failedbind!\n");return0;}//进入监听模式if(listen(Listen_sk,2)==SOCKET_ERROR){printf("Failedlisten!\n");return0;}//循环接受客户的连接请求sockaddr_inremoteAddr;intnAddrLen=sizeof(remoteAddr); SOCKETConnect_sk=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);while(true){//接受新连接Connect_sk=accept(Listen_sk,(sockaddr*)&remoteAddr,&nAddrLen);if(Connect_sk==INVALID_SOCKET){printf("Failedaccept!");continue;}printf("接受到一个连接:%s\r\n",inet_ntoa(remoteAddr.sin_addr)); //接收数据 charbuff[500]; intnRecv=recv(Connect_sk,buff,strlen(buff),0); if(nRecv>0) { printf("接收到数据:"); for(inti=0;i<nRecv;i++) { printf("%c",buff[i]); } printf("\n"); }closesocket(Connect_sk);}//关闭监听套接字closesocket(Listen_sk); WSACleanup();return0;}、客户端代码#include<stdio.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32")intmain(void){ SOCKETs; WSADATAwsaData; WSAStartup(MAKEWORD(2,2),&wsaData); //创建套接字 s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s==INVALID_SOCKET) { printf("创建套接字失败!\n"); return0; } //填写远程地址信息 sockaddr_inservAddr; servAddr.sin_family=AF_INET; servAddr.sin_port=htons(4567); servAddr.sin_addr.S_un.S_addr=inet_addr(""); if(connect(s,(sockaddr*)&servAddr,sizeof

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论