欢迎来到天天文库
浏览记录
ID:12123891
大小:365.50 KB
页数:9页
时间:2018-07-15
《基于tcp的双客户信息传输程序--陈嘉明--》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于TCP的双客户信息传输程序陈嘉明2012021750物理与电信工程学院电子与通信工程摘要:本文介绍了基于TCP/IP协议的客户端和服务器通信的基础上,在Linux的环境对套接口进行编程,实现了双客户间的通信,服务器对客户间的信息进行加密和监控,客户程序则对信息进行解密读取。关键词:双客户通信;Linux;TCP/IP协议;Socket套接口;I/O复用;select函数;1.前言大多数的网络应用系统可以分为两部分:客户(client)和服务器(server),它们通过TCP/IP协议进行信息的传输。通过套接口编写使用TCP或UDP的网络应用程序便可以实现不同的功能。在简单
2、的回射服务程序中,通过捕获信号SIGCHLD来处理僵尸进程;但由于客户阻塞于等待用户输入,当服务进程被终止时,客户并不能立即收到信息。通过基于select函数及poll函数的I/O复用技术,我们可以做到:当条件满足(如输入设备已被读、描述字可以承受更多的输出),就能被通知并采取行到,而不是被动等待。如此,程序不但简洁、时效性高,而且充分利用了资源。基于以上的技术,编写出了双客户通信程序,功能有三:一客户能发送信息,接收并解密信息;二服务器能将客户信息加密后再传输;三服务器对客户通信进行监听,包括时间、套接字、通信内容。2.套接口函数一个完整的TCP客户及服务器程序是需要一系列
3、基本套接口函数来支持的,下面可以看到这些函数相互配合,搭建了网络通信程序的各个环节。2.1TCP的连接TCP通过三路握手来达到连接,下面是它们的步骤:A服务器必须准备好接受外来的连接,可以通过调用socket、bind和listen等函数完成,称为被动打开;B客户通过调用connect进行主动打开。这引起客户TCP发送一个SYN分节(表示同步),它告诉服务器客户在连接中发送的数据的初始序列号。一般情况下SYN分节不携带数据,它只含一个IP头部、一个TCP头部及可能有的TCP选项。C服务必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送数据的初
4、始序列号。服务器以单个分节向客户发送SYN核对客户SYN的ACK。D客户必须确认服务器的SYN。9图1三路握手建立TCP同步连接2.2基本套接口函数图2基本TCP客户-服务器程序的套接口函数Asocket函数#includeIntsocket(intfamily,inttype,intprotocol);返回:非负描述字----成功,-1-----出错为了执行网络输入输出,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP、Unix域字9节流协议等)。代码中的family指明协议族
5、,它是图2中所示的某个常值。套接口的类型type是图3中所示的某个常值。一般来说,函数socket的参数protocol设置为0。Bconnect函数TCP客户用connect函数来建立一个与TCP服务器的连接。当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接,并仅在连接建立成功或出错时才返回;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。当循环调用函数connect,以尝试给定主机的每个IP地址直到有一个成功时,每当函数connect失败,都必须关闭套
6、接口描述字,重新调用socket。#includeintconnect(intsockfd,conststructsockaddr*servaddr,socklen_taddrlen);返回:0------成功,-1--------出错第一个参数sockfd是由socket函数返回的套接口描述字,第二、第三个参数分别是一个指向套接口地址结构的指针和该结构的大小。大多数套接口函数都需要一个指向套接口地址结构的指针作为参数。每个协议族都定义它自己的套接口地址结构。这些结构的名字均以“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。套接口地址
7、结构必须含有服务器的IP地址和端口号。IPv4套接口地址结构通常也称为“网际套接口地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中。Cbind函数bind函数为套接口分配一个本地协议地址,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合。#includeIntbind(intsockfd,conststructsockaddr*myaddr,socklen_taddrlen);返回:
此文档下载收益归作者所有