- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于TCP的双客户信息传输程序 陈嘉明 2012021750 物理与电信工程学院 电子与通信工程 摘要:本文介绍了基于TCP/IP协议的客户端和服务器通信的基础上,在Linux的环境对套接口进行编程,实现了双客户间的通信,服务器对客户间的信息进行加密和监控,客户程序则对信息进行解密读取。 关键词:双客户通信;Linux;TCP/IP协议;Socket套接口;I/O复用;select函数; 1.前言 大多数的网络应用系统可以分为两部分:客户(client)和服务器(server),它们通过TCP/IP协议进行信息的传输。通过套接口编写使用TCP或UDP的网络应用程序便可以实现不同的功能。 在简单的回射服务程序中,通过捕获信号SIGCHLD来处理僵尸进程;但由于客户阻塞于等待用户输入,当服务进程被终止时,客户并不能立即收到信息。通过基于select函数及poll函数的I/O复用技术,我们可以做到:当条件满足(如输入设备已被读、描述字可以承受更多的输出),就能被通知并采取行到,而不是被动等待。如此,程序不但简洁、时效性高,而且充分利用了资源。 基于以上的技术,编写出了双客户通信程序,功能有三:一客户能发送信息,接收并解密信息;二服务器能将客户信息加密后再传输;三服务器对客户通信进行监听,包括时间、套接字、通信内容。 2.套接口函数 一个完整的TCP客户及服务器程序是需要一系列基本套接口函数来支持的,下面可以看到这些函数相互配合,搭建了网络通信程序的各个环节。 2.1 TCP的连接 TCP通过三路握手来达到连接,下面是它们的步骤: A服务器必须准备好接受外来的连接,可以通过调用socket、bind和listen等函数完成,称为被动打开; B客户通过调用connect进行主动打开。这引起客户TCP发送一个SYN分节(表示同步),它告诉服务器客户在连接中发送的数据的初始序列号。一般情况下SYN分节不携带数据,它只含一个IP头部、一个TCP头部及可能有的TCP选项。 C服务必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送数据的初始序列号。服务器以单个分节向客户发送SYN核对客户SYN的ACK。 D客户必须确认服务器的SYN。 图1 三路握手建立TCP同步连接 2.2 基本套接口函数 图2 基本TCP客户-服务器程序的套接口函数 A socket函数 为了执行网络输入输出,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP、Unix域字节流协议等)。代码中的family指明协议族,它是图2中所示的某个常值。套接口的类型type是图3中所示的某个常值。一般来说,函数socket的参数protocol设置为0。 B connect函数 TCP客户用connect函数来建立一个与TCP服务器的连接。当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接,并仅在连接建立成功或出错时才返回;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。当循环调用函数connect,以尝试给定主机的每个IP地址直到有一个成功时,每当函数connect失败,都必须关闭套接口描述字,重新调用socket。 第一个参数sockfd是由socket函数返回的套接口描述字,第二、第三个参数分别是一个指向套接口地址结构的指针和该结构的大小。 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数。每个协议族都定义它自己的套接口地址结构。这些结构的名字均以“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。套接口地址结构必须含有服务器的IP地址和端口号。 IPv4套接口地址结构通常也称为“网际套接口地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中。 C bind函数 bind函数为套接口分配一个本地协议地址,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合。 第一个参数sockfd是socket函数返回的套接口描述字;第二个参数my_addr 是指向数据结构 struct sockaddr 的指针,保存地址(即端口和 IP 地址) 信息,第三个参数是一个指向特定于协议的地址结构的长度。 当服务器启动时,要捆绑众所周知端口,这在固1.9中我们已看到了。如果TCP客户或服务器不这么做,当调用函数connect或Usten时,内核就要为套接口选择一个 临时端口。对于TCP,通过调用函数bind可以指定IP地址或端口,可以都指定,也可以都不指定。
文档评论(0)