




免费预览已结束,剩余6页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于TCP/IP的SOCKET接口实现网络通信姜 文 平谭晖(湖北省邮电科学研究院430010)摘要在简单说明基于TCP/IP的SOCKET编程的基本原理的基础上,介绍了在UNIX环境下怎样编写客户端和服务器端的通信模块的方法,以及Visul C+ 5.0提供的SOCKET编程机制。关键词TCP/IPSOCKET接口编程计算机软件网络通信基于TCP/IP的SOCKET通令编程接口由4BSDUNIX首先提出,它只能用于UNIX系统。随着微机应和越来越广泛,SOCKET在UNIX的成功应用使得将SOCKET移植到DOS和WIDOWS下成为一件有意义的工作,因此在90年代初,SUN MICROSYSTEM、JSB CORPORATION、FTP SOFTWARE、MICRODYNE以及MICROSOFT等共同制定了一套标准,即WIDOWS SOCKETS规范,把SOCKET机制引入了WIDOWS,先后推出了WINSOCK 1.0、WINSOCK 1.1、WINSOCK 2.0,由于WIDOWS操作系统与UNIX系统任务调度方式的区别,WINSOCK除了可以兼容UNIX和SOCKET编程接口外,又把它加以扩展以适合WIDOWS文件驱动特性。由于WINDOWS编程方法相对复杂,为此,现在提供的编程语言中,都将该机制封装到类中,通过类来编写基于WINDOWS/NT下的网络通信程序。下面我们分别介绍SOCKET通信的有关概念,以及UNIX下的SOCKET编程和基于WINDOWS/NT开发工具提供的SOCKET编程方法。一、基于TCP/IP的SOCKET编程的基本原理利用基于TCP/IP的SOCKET通信编程接口编写程序,其目的是在TCP/IP所组建网络的不同机器之间利用客户/服务器模式建立通信连接。为建立该连接,开发人员只要提供一些基本的连接信息,其余由操作系统内核来完成。下面我们来讨论建立一个完整通信连接开发者需要提供的信息。以机器A通过TCP/IP与机器B进行网络通信为例,对于机器A来说我们需要知道如下信息:(1)机器B的TCP/IP地址;(2)与机器B中哪一个进程(或软件系统)联系。以上两个需要的参数,第一个显然可以被大家理解,但第二个也许有人存在疑问,因为象电子邮件收发、TELNET、PING等基本的TCP/IP网络应用程序,在建立连接时都只要提供TCP/IP地址(或者对应域名地址),根本没有必要提供第二个参数,这是为什么呢?其实原因很简单,就是它们使用的是一些标准接口,第二个参数早就定义了,这些应用系统在发出呼叫请求前,自己已经知道该与对方怎样联系,在发请求前,自动将第二个参数加入请求中。如果开发者也要开发这样的系统,就需要知道这些标准接口;对于那些需要建立专用系统网络连接的,却需要双方协商。以上两个需要提供的参数,在套接字中分别表示为机器B的地址和机器B的通信端口。通过在同一机器的不同通信软件中定义不同端口地址,来表示机器A是与机器B中哪套系统通信。不管是利用何种协议,完全建立一个网络连接需要五个基本信息。它们分别是双方的地址、约定的通讯端口和协议类型。SOCKET通信编程接口并不是专门为TCP/IP通信提供的,因此套接字通信编程需要在参数中指明通信协议类型。套接字是利用客户/服务器模式来实现通信的,客户端软件和服务器端软件的具体实现也有所不同。具体来说,在客户端利用基于TCP/IP和SOCKET通信编程的基本步骤是:声明一个套接字类型的变量,需要在该变量定义中提供本机IP地址和通信端口并指明协议类型,由于在此介绍的是基于TCP/IP的套接字通信,因此协议类型应该是TCP/IP,在编程接口中该类型用AF-INET来表示;向对方发出连接请求,连接时编程者需要提供对方TCP/IP地址和通信端口,同时SOCKET实现程序自动向对提供本机TCP/IP地址和通信端口;如果连接成功,会收到对方的应答信号,这以后的通信就可以通过套接字的相关操作来实现了。利用SOCKET来实现服务器端通信软件的步骤是:同客户端程序第1个步骤;服务器端通信软件进入等待客户端连接的状态,如果收到连接,则从对方连接请求中获取对方的IP地址和通信端口,并向对方发送连接成功的应答信号。由上面的介绍可知,客户端与服务器端通过SOCKET通信都需要知道5个基本信息,不同的是客户端软件开发者需要向编程接口全部提供5个参数,而服务器端软件开发者只需要提供3个。需要注意的是客户端和服务器端所提供的本地端口地址可以相同,可以不同,但客户端口地址可以动态分配,而服务器端端口地址必须固定,否则连接就不能建立。下面介绍在不同编程语言中编写与客户端和服务器端的通信模块。二、UNIX下通过SOCKET实现面向连接的网络通信下面分别介绍在UNIX环境下编程时,怎样编写客户端和服务器端的通信模块。1.客户端通信模块(1)步骤一,定义套接字变量在UNIX中是通过结构sockaddr_in来定义套接字通信的基本信息(该结构的详细内容请参见有关资料),然后通过该结构由系统分配一套接字。我们声明客户端相关变量如下:struct sockaddr_in ClientSocketAddr;/*本机通信地址信息变量*/struct sockaddr_in ServerSocketAddr;/*服务器通信地址信息*/intClientSocket;/*套接字句柄变量,也就是系统分配的套接字*/int ret,socklen;(2)步骤二,初始化相关信息,并向系统请求分配套接字对应程序如下:ClientSocketAddr.sin_port=htons(2086);/*指定通信端口为2086,并将端口号转换成为网络字节顺序*/ClientSocketAddr.sin_addr.s_addr=0x81010101f;/*本机IP地址:1,该语句赋值也可用inet_addr(“1”)代替*/ClientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);/*分配套接字,参数含义见有关参考书,对于基于TCP/IP编程来说,固定使用该格式调用就可以了*/if(ClientSocket0)/*分配失败的原因一般是系统资源不够引起的*/perror(“Cant allocate a new socket! n”);return;socklen=sizeof(ClientSocketAddr);/* sockaddr_in结构的长度是在不同环境下是不同的,故在此取其大小*/ret=bind(socketid,&ClientSocketAddr,socklen);/*将套接字与本机的地址信息结合(绑定)起来*/if(ret=-1)/*绑定失败一般是由于IP地址不正确或者对应通信端口已经与别的套接字绑定了引起的*/perror(“Cant bind the new socket to socketaddress”);close(socketid);return;指定通信端口为2086时,如果不指定一具体端口,该值可以用系统定义常量INADDR_ANY来代替,表示由系统分配任意一个空闲的套接字,这种方式对于客户端来说应该还要保险些。因为指定端口可能被别的系统占用,这时系统就不能分配该端口对应的套接字给本部分程序,导致下面的分配失败。(3)向服务器端发出连接请求ServerSocketAddr.sin_port=1088;/*指定服务器通信端口为1088*/ServerSocketAddr.sin_addr.s_addr=inet_addr(“0”);/*服务器IP地址:0*/connect(ClientSocket,&ServerSocketAddr,sizeof(ServerSocketAddr);2.服务器端通信模块(1)步骤一和二同客户端程序下面列出对应C程序:int ServerSocket,ret,socklen,newsocket,clientsocklen;+struct sockaddr_in ServerSocketAddr,ClientSocketAddr;ServerSocketAddr.sin_family=AF_INET;ServerSocketAddr.sin_port=htons(1088);/*将端口号转换成为网络字节顺序*/ServerSocketAddr.sin_addr.s_addr=inet_addr(“0”);/*将IP地址串转换成为内部表示地址信息*/ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);/*分配服务器套接字*/if(ServerSocket0)perror(“Cant allocate a new socket! n”);return;socklen=sizeof(ServerSocketAddr);ret=bind(ServerSocket,& ServerSocketAddr,Socklen);/*将该套接字与服务器通信地址信息绑定*/if(ret=-1)perror(“Cant bind the new socket to socketaddress”);close(ServerSocket);return;(2)步骤三,进入监听客户端连接请求状态,并进入等待客户连接请求状态if(listen(ServerSocket,5)0)/*建立长度为5的请求队列,以允许多个五个客户端同时连接/*perror(“Listen error;”);close(ServerSocket);return;for(;)newsocket=accept(ServerSocket,&sockaddr,&socklen);/*监听客户连接请求,如果没客户端连接,程序将一直在此等待*/*连接建立后,用生成的新套接字来处理当前连接请求,而原来监听的套接字继续监听别的连接请求*/if(newsocketClentType=cnNonBlocking;ClientSocket1-Port=8088;ClientSocket1-Address=”00”;if(ClientSocket1-Active!=true) /*判断该连接是否可用*/ClientSocket1-Open();/*若不可用,建立该连接*/void_fastcall TForm1:ClentSockt1Read(Tobject Sender,/* OnReading事件响应函数*/TCustomWinsocket*Socket)char buff1024;memset(buff,0,1024);/*初始化授受缓冲区*/ClientSocket1-Socket-ReceiveBuf(buff,1024);/*接受数据*/if(ClientSocket1-Active=true)/*判断该连接是否可用*/ClientSocket1-Socket-ReceiveBuf(buff,strlen(buff)+1);/*若可用,发送数据*/elseClientSocketl-Open():/*若不可用,建立连接*/void_fastcall TForm1:ClentSockt1Read(Tobject Sender,TCustomWinsocket*Socket)/* OnReading事件响应函数*/ClientSocket1-Socket-ReceiveBuf(buff,strlen(buff)+1);/*发送数据*/void_fastcall TForm1:ClentSockt1Read(Tobject Sender,TCustomWinsocket*Socket,TErrorEvent ErrorEvent,int &ErrorCode)/*OnError 事件响应函数*/switch (ErrorCode)/*判断错误号,作出相应处理*/2.服务器端程序编制步骤(1)设置ServerType属性为ctNonBloc-king,设置所要监听的端口号;(2)将Active属性置为true或利用TServerSocket抽象类中的Open方法开始监听;(3)在OnAccept事件响应函数中加入相应处理函数,并记录下连接客户端的IP地址;(4)在OnClientRead事件响应函数中,加入响应接收网络数据的处理方法;(5)利用ServerSocket1-Socket-Connectionsi-SendBuff方法向相应客户端发送数据;(6)利用ServerSocket1-Socket-Connectionsi-Close方法关闭与相应客户端的连接;(7)Active属性置为false或利用TServerSocket抽象类中的Close方法。服务器端程序如下:TServerSocket ServerSocket1;char cConnect10020;int iConnectCount;ServerSocket1-ServerType=cnNonBlocking;ServerSocket1-Port=8088;iConnectCount=0;for(i=0;iActive!=true)/*判断是否在监听*/ServerSocket1-Open();/*若不在临听,启动监听*/void_fastcall TForm1:ServerSocket1Accept(TO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七大员考试试题及答案
- 初级家政服务员理论考核试题及答案
- 现代仪器分析理论知识考核试题及答案
- 教育行业质量认证体系建设与实施路径研究报告
- 国家开放大学电大本科2025年秋合同法期末试题及参考答案
- 武胜县城镇公益性岗位招聘笔试真题2024
- 2025-2030汽车毫米波雷达天线设计与性能优化专项研究报告
- 2025-2030民用无人机维修保养服务体系构建与后市场盈利模式分析
- 北京市法院系统事业单位招聘笔试真题2024
- 2024年江西冶金职业技术学院招聘真题(行政管理岗)
- 检验员考核标准
- 2025-2030咖啡豆和胶囊行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 餐饮业安全生产管理制度汇编
- 杜绝抱怨的培训
- 《空调维护培训资料》课件
- 底泥资源化利用研究进展
- 大企业税收风险分析典型案例汇编
- 混凝土质量保证措施
- 烟气CEMS在线比对验收调试报告附表D.1-12计算公式(HJ-75-2017)
- 学生请假安全协议书
- 隐形眼镜项目风险管理分析
评论
0/150
提交评论