毕设论文-基于Linux平台的聊天软件的设计与研究.docx

上传人:来看看 文档编号:3951263 上传时间:2019-10-11 格式:DOCX 页数:54 大小:884.51KB
返回 下载 相关 举报
毕设论文-基于Linux平台的聊天软件的设计与研究.docx_第1页
第1页 / 共54页
毕设论文-基于Linux平台的聊天软件的设计与研究.docx_第2页
第2页 / 共54页
毕设论文-基于Linux平台的聊天软件的设计与研究.docx_第3页
第3页 / 共54页
毕设论文-基于Linux平台的聊天软件的设计与研究.docx_第4页
第4页 / 共54页
毕设论文-基于Linux平台的聊天软件的设计与研究.docx_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《毕设论文-基于Linux平台的聊天软件的设计与研究.docx》由会员分享,可在线阅读,更多相关《毕设论文-基于Linux平台的聊天软件的设计与研究.docx(54页珍藏版)》请在三一文库上搜索。

1、南京工程学院毕业设计说明书(论文)京工程学院毕业设计说明书(论文)作者:学号:208110333院系:通信工程学院专业:通信工程(电力通信)题目:基于Linux平台的网络聊天软件的设计与研究指导者:评阅者: 2015 年 6 月 南 京Design and implementation a software which can communicate on LinuxA Dissertation Submitted toNanjing Institute of TechnologyFor the Academic Degree of Bachelor of ScienceByDeZhou Zh

2、angSupervised byLecturer Lei TangCollege of Communication EngineeringNanjing Institute of TechnologyJune 2015摘要Linuxkernel由于其代码的开源及获取方便等优点,越来越受到广大技术人员的青睐。Linux系统提供了完整的内核源代码,在此代码的基础上可以进行自定义,从而打造属于自己的“专属”系统。Socket通讯使用C/S模型,Socket上TCP/IP网络应用程序接口(API),提供了很多函数方开发人员利用。Socket通讯有两种传输协议:TCP协议和UDP协议,TCP协议是面向连

3、接的,传输可靠的;UDP是无连接的,传输不可靠的,因此本设计中选用TCP。进程和线程是不同的,进程拥有自身的程序映像和地址空间,是内核调度的基本单元,每个单独的进程都有自己的代码段、数据段以及堆栈,它们使用自己的虚拟地址空间,多个进程间互不影响。而线程没有自己独立的地址空间,创建出来的新线程和创建它的进程共享一个虚拟地址空间。这些知识点将在论文中详细介绍。本设计主要对服务端和客户端程序进行编写并对其进行调试,从而实现客户端和服务端之间的通信。总的来讲,本设计使用C语言开发,通过Socket建立连接,并创建多个线程的实现多任务。关键词:Linux内核;socket;进程;线程;多任务Abstra

4、ctBecause of merit in opening of source code and getting convenient, linux kernel become more and more popular among the programmers. Linux provides integrated source code of Linux-kernel, people can make special system belongs to themselves based on the source code.Socket communication use C/S mode

5、l, and the API of TCP/IP on it provides plenty of functions for programmers to use. Socket communication has two transfer protocols: TCP and UDP; TCP is connection and reliable, but UDP is connectionless and unreliable. So, wechoose TCP in this design.Process is different from thread. Process has it

6、 procedure map and address space, its basic unit of the kernel scheduling, each single process has its own text、data and stack, they use theirs virtual address space and dont affect each other. But thread doesnt have independent address space, it shares the virtual address space with the process who

7、 creates it. This knowledge will be introduced in my thesis.This design realizes communication between client and server by debugging in client and servers code. In general, this design uses C language, connects by socket and creates multiple threads to implement multitasking.Keywords:Linux-kernel;s

8、ocket;process;thread;multitask目录第一章绪论11.1 设计背景11.2 应用概述21.3为什么选择Linux41.4 论文的主要工作5第二章 Linux编程常用工具62.1 嵌入式C语言62.2 GCC工具链72.2.1 GCC的用法82.2.2 调试和剖析选项82.3 GDB调试器92.3.2 GDB用法92.3.1用gdb调试GCC程序10第三章设计的实现及主要技术133.1 实现分析133.1.1 功能分析133.1.2 设计分析133.1.3 技术分析143.3 Socket(网络套接字)183.3.1 编程步骤193.3.2 地址及顺序地址193.3.3

9、 链接函数说明223.4 进程253.4.1 进程的概念253.4.2 进程的内存布局263.4.3 进程生命周期273.5 多线程283.5.1 线程的概念283.5.2 进程和线程的关系及优缺点283.5.3 数据类型及其用法303.6 线程同步313.6.1 概念313.6.2 线程同步的几种方法:信号量、自旋锁、互斥量323.6.3 互斥量的使用323.7 ncurrses字符界面333.7.1 ncurses简介333.7.2 ncurses常用函数介绍34第四章设计的编程实现364.1 聊天室Socket编程连接364.2 聊天室程序设计及界面设计384.2.1 服务器384.2.

10、2 客户端384.2.3 客户端主体界面及功能展示41第五章总结与展望445.1 全篇总结445.2 设计中遇到的问题及解决办法445.3 设计有待改进的地方46致谢47参考文献48第一章 绪论1.1设计背景Linux是兼容POSIX的U-like操作系统,大多数重要的UNIX工具、应用程序和网络协议都能在其上运行。Linux系统目前已经得到了很广泛的应用。它是由芬兰人Linux Torvalds开发的。Linux最初是为intel_x86平台开发的免费操作系统,从那时开始Linux就被陆续移植到其他硬件工作平台。在服务器方面Linux操作系统一直处于领先地位,比如大型机和超级计算机,但在桌面

11、用户市场只占到了1.5%。Linux也可以运行在嵌入式设备之中,这些设备主要包括移动电话、平板电脑、网络路由、自动控制设备和电视机等等。Android是Linux操作系统在平板和智能电话中用的最为广泛的一款操作系统构建与Linux Kernel上层。基于代码开源的优势,linux具有强大市场竞争力。只要想获得源码,便可从官方网站上获取Linux Kernel源代码,有了源代码之后就可以自定义操作系统了。在此基础上安装自己的应用软件,至此一个完整的属于自己的操作系统就诞生了。通常将这样安装所获得的系统称为Linux系统,这是因为它包含的不止一个内核。提及Linux,那就得提到GNU和Unix。1

12、983年9月27号,Richard Stallman希望开发一套完整的开放源码操作系统以取代Unix,从而诞生了GNU。1985年,发表GNU宣言;1989年,发表GNU(GNU Gneral Public License,GPL);GPL的开源思想使得我们的学习之路顺畅了许多。GPL保障了Linux不仅仅是当下自由可用,而且今后经过任何修改后还是自由可用的,这点充分体现了Stallman的初衷。Unix是于1969年在美国AT&T公司贝尔实验室开发出来的具有多任务,多用户的操作系统。Unix的前身叫做Multics,由BELL Labs参与研发,可是由于进度缓慢,Bell Labs不得不放弃

13、了这个计划。在这之后就由贝尔实验室的职员Ken thompson,Dennis Ritchie等继续自行开发。在此之后的10年里,Unix在大型企业和学术界得到了普遍的应用,其不断扩大的影响力终究还是引起了AT&T的关注,就这样一场持续许久的版权官司开始了,直到AT&T将自己的贝尔实验室卖给Novell接手。最初的UNIX是用PDP-7汇编语言别写的,但因为其在系统编程方面没有太大优势,于是Thompson和Ritchie两人对其加以改造,并于1971年共同发明了C语言。1973年thompson和Ritchie用C语言重写了UNIX,UNIX第三版就这样问世了。在当时,系统程序大多是由汇编语

14、言编写,thompson和Ritchie此举是非常具有革新意义的。用C语言编写的Unix代码紧凑简洁、易读、易修改,为此后Unix的进一步发展奠定了扎实的基础。1.2应用概述嵌入式Linux是指运行在分布式嵌入式设备上的Linux操作系统,尽管“embedded”这一词经常用来讨论内核方面的知识,但嵌入式应用上的Linux kernel并没有什么特别之处。Linux内核都是一样的,只不过在不同的嵌入式设备上需要进行不同的编译步骤,从而让Linux操作系统能够在嵌入式设备上跑起来。嵌入式操作系统就是将Linux内核和其他各种软件编译成的能够运行在嵌入式分布式设备中的系统。你得通过付款的方式获得这

15、特定的编译工具,这些编译工具通常指:交叉编译器、调试器、项目管理软件、引导镜像等等,从而得到完整的一个运行在嵌入式设备上的操作系统。随着网络的不断发展,网络在嵌入式系统中应用十分广泛,越来越多的嵌入式设备均采用Linux操作系统。传统的嵌入式系统设备如:空间站、自动系统、消费电子系统、电话等等都使用Linux系统,但这些嵌入式Linux系统大体上都相同,没有什么新颖的特色。而且这些都没有提及到系统的结构,Linux系统的结构真正信息包括:大小、实时、网络能力、和用户的交互能力。Linux系统的选型非常重要,针对不同用户的需求不一,Linux有很多发行版,在这之中又分很多类:桌面版、服务器版、企

16、业版。桌面版针对的大多是普通用户,有很好的桌面环境,比较适合于新手;服务器版多倾向与终端界面,没有较好的桌面环境,在服务器开发方面有很大优势;企业版则面向的大多是大型企业,对信息安全,网络稳定方面都很高。Linux由于其公开的源码及免费的操作系统,在Linuxkernel的代码获取及相关构建工具没有任何限制。因此对基于Linux平台的Socket网络编程的研究就显得很重要,下图1.1为其C/S简易模式图和图1.2详细模式图:图1.1C/S简易模式图图1.2C/S详细模式图编写Socket的server和client端程序,双方通过socket建立连接,从而完成进一步的通信。1.3 为什么选择L

17、inux1.代码的质量和可依赖性。质量和可依赖性是衡量代码优劣的重要标准。尽管在“quality code”众说纷纭,但是大多数编程人员所期望的都有如下几点:(1)模块化:每一个功能都写成一个模块,这样不仅易于读写,更加方便以后的移植;(2)可读性:一段代码应该能让别人看的下去,这里包括变量的定义,尽量取有意义的变量名,避免int i,j这样的定义;一段杂乱的让人看一眼就不想往下看的代码一定是不好的,不管功能有多牛。;(3)可扩展性:在增加新的功能时,不要对原来的代码进行大篇幅的修改,而是只要添加对应的功能即可;(4)可配置性:可以选择对应的功能特色进行编译,不要的就不编译,从而生成的程序适合

18、自己的使用。但是配置的过程应该尽量简单人性化。2.TCP/IP协议由网络层的IP协议和传输层的TCP协议组成,是Internet最基本的协议、是Internet国际互联网络的基础。Socket通信所采用的协议分为面向连接(TCP)和非面向连接(UDP)的两种,但由于UDP效率较高但是传输不可靠,不能胜任复杂的网络环境,不得不通过超时和重传等手段来实现较高的可靠性;然而TCP在数据传输方面提供了完全的可靠性,因此选用TCP/IP协议更加可靠些。3.代码的可获得性。Linux kernel源码及所有的开发和编译工具是很方便从网络上获取的。Linux中最重要的部分Linux kernel分布在GPL

19、下。其他的代码也分布在相同的证书下,如BSD等。构成Linux的大部分代码都是没有限制的。当源码的访问受限时,开放自由软件组织就会寻找新版本的源码包代替原有的代码。正是由于这一特性,Linux受到很多电话制造商的青睐,他们将其移植到自己产品中,稍作修改优化使其适合自己的产品。4.硬件支持。Linux支持不同种类的硬件平台和设备,尽管有些驱动暂不支持Linux系统,但是对此有很大的期待。因为很多驱动都由Linuxshequ 维护着,你可以毫无顾忌的使用这些驱动。各种硬件协同工作,使你的工作更加顺畅。你希望在你自己电脑上编写的程序能够在 另一架构的操作系统上正常运行,甚至有不同的设备驱动运行在不同

20、的系统架构上。5.通信协议和软件标准。Linux提供了广泛的通信协议和标准的软件支持。这使得整合Frameworks及相关软件到Linux上变得更加容易。同时,Linux是U-like的,可以方便的将UNIX程序移植到Linux上。事实上,许多应用被绑定在一些商用Unixes中,继而被移植到Linux中。1.4 论文的主要工作第一章:绪论,大体介绍Linux操作系统发展、应用的现状以及我们选择Linux系统的原因;第二章:介绍Linux软件开发中使用的编译工具和调试工具及其简单的使用方法;第三章:介绍设计是怎样实现的以及在实现的过程中用到了哪些关键技术并对这些关键技术作简要分析;第四章:介绍设

21、计相关的主要代码的实现过程,依次对服务器和客户端主要流程进行介绍,必要的功能展示;第五章:设计总结与展望第二章Linux编程常用工具2.1嵌入式C语言C语言最初是由贝尔实验室的职员Thompson和Ritchie于1971年共同开发。其应用场景很多,如:操作系统:Linux;微控制器:汽车和航天飞机;嵌入式处理器:电话和便携式电子设备等;DSP Processer:数字音频图像处理和TV系统等。程序的生成过程如图2.1所示:图2.1程序的生成过程C语言能够在编程开发领域受到如此高的青睐,主要有以下几个方面的原因:1.通用性。因而在跨平台开发时非常方便,C语言的这一特性吸引着广大编程爱好者;2.

22、执行速度快。可以指定编译选项从而省去中间过程,以进一步提升程序的执行效率。3.可移植性。由于各个平台的差异,当一个程序到不同平台上,只需要从新编译一下源代码即可使用;4.发展快速。C语言发展较快。在上世纪80年代末期由American National Institude发布的ANSI C的C语言标准奠定了其发展的基石。2.2GCC工具链GNU/Linux操作系统上往往使用gcc作为编译工具。其不是一个单独的程序,而是多个程序的组合,因而通常称为toolchain(工具链)。GCC的全称是GNU Complier Collection,是由GNU Project提供的支持多种编程语言的编译器。

23、GCC是GNU toolchain中的重要组成部分,GCC作为一个工具和实例,在自由软件的成长过程中扮演着重要的作用。同年12月,GCC扩展到能够编译C+,不久之后能够支持的语言更多,如Objective-C、Objective-C+、Fortran、Java和Ada等等。GCC被移植到多种架构的处理器,并作为一种专业软件开发工具配置于系统中。GCC同时也集成于大多数嵌入式平台,包括Symbian,AMCC等。作为GNU操作系统官方指定编译器,GCC被其他U-like操作系统吸收采用,包括Linux和BSD家族。程序的编译过程如图2.2所示:图2.2 源码到可执行文件的过程2.2.1GCC的用

24、法对于GCC的编译选项只要掌握一些常用的选项就可以,其他多大100多种选项有些工程师可能一辈子也不会用到。gcc基本用法:gcc -Wall -O1.3 -g -o name file.-Wall: 打开所有警告项-O: 设置优化级别,O0表示关闭优化功能-g: 将调试信息编译到目标文件中-o name: 指定输出文件的名称是namefile: 被编译(链接)的文件2.2.2调试和剖析选项gcc g:以本机格式(stabs,COFF,XCOFF,or DWARF 2)生成调试信息供gdb使用。在大多数系统上,“-g”产生的调试信息只能供GDB使用,这种调试信息在gdb中能很好的工作,而在其他调

25、试器上不是读取不了就是调试器异常崩溃。如果你想指定调试信息的格式,可通过如下方式:-gstabs+、 -gstabs、-gxcoff+、-gxcoff、-gvmsgcc允许同时使用-g、 o,这种使用方法将会产生令你意想不到的效果:你定义的一些变量可能不存在、程序会跑飞掉、一些语句不会被执行。不管是否提供可能的优化输出,但可以肯定的是,这将会产生一些bug。但是这种方法使得你能够在和最终产品尽可能相同的情况下对代码进行调试。应当注意,如果你同时使用这两个编译选项,必须清楚所写的某些有关代码已经在优化时被GCC作了些改变。2.3GDB调试器GDB(GNU Debuger),是GNU操作系统的标注

26、调试器;。GDB作为GNU系统的一部分于1986年由Richard Stallman编写,是GPL下的自由软件。使用者可以监视和修改程序的内部变量,甚至可以独立地调用程式正常行为的函数。GDB能对多种不同处理器架构上运行出错的应用软件排错,这些处理器架构包括:Alpha、ARM、AVR、H8/300、Altera Nios/Nios II、System/370、System 390、X86及其64位扩展。GDB明显的限制是在他的运用方面,没有较亲和的图形界面,预设只有命令行界面可用。Gdb是为了让你能够“看到”另一程序执行时具体做了什么或者是另一程序崩溃时发生了什么GDB可以做四件事情帮助你找

27、到程序中的bug:(1) 启动你的程序,指定任何可能影响其行为的变量或函数等;(2) 使你的程序暂停(设置断点)或者指定特定的状态;(3) 当你的程序终止时,检测发生了什么;(4) 改变你程序中的事情,这样你就可以尝试纠正一个bug的影响以便继续往下找另一个bug。2.3.2GDB用法gdb的基本命令:gdb提供的各种各样的命令有着不同的功能。从简单到复杂,以下列出了一些常用的gdb调试命令:(1)file filename:在gdb模式中无需退出即可通过file命令装在你要调试的文件(gdb) file davidReading symbols from /home/david/Gradua

28、tion_project/david.(no debugging symbols found).done.(2)kill:通过kill命令可以终止当前正在调试的程序(gdb) killKill the program being debugged? (y or n) y 还有一些常用的如:n(next)、s(step)、run和q(quit)将在下节例程中详细说明。2.3.1用gdb调试GCC程序在终端输入gdb回车后,会出现如下一长串内容:davidzdz:Graduation_project$ gdbGNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1

29、) 7.4-2012.04Copyright (C) 2012 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type show copyingand show warranty for details.This GDB was configured as x

30、86_64-linux-gnu.For bug reporting instructions, please see:.(gdb)Gdb的一些使用命令如果记不住的话可以查看官方手册,没必要硬记,准其自然,每次不会的时候翻翻手册,时间长了自然就记住了下面只介绍一些常用的几个命令:比方说,现在有一个通过gcc编译好的可执行文件david,在程序中我定义了两个变量x,y赋初值为5,6终端执行davidzdz:Graduation_project$ ./david The result is:x + y is 11x * y is 30x / y is 0那么通过gdb来看看发生了什么:davidzd

31、z:Graduation_project$gdb david(gdb)我们现在告诉gdb使用窄于通常的显示宽度:(gdb) set width 70下面我要知到david这个程序怎样工作的,通过阅读源程序我大体知道工作流程,所以我可以设置断点:(gdb) break countBreakpoint 1 at 0x400579接下来运行程序:(gdb) runStarting program: /home/david/Graduation_project/david The result is:Breakpoint 1, 0x0000000000400579 in count ()可以发现程序停

32、在count()函数这个地方,The result is :这句话显示count()函数之前都已运行完毕。现在我可以通过n(next)让程序执行到下一行(gdb) nSingle stepping until exit from function count,which has no line number information.x + y is 11x * y is 30x / y is 00x0000000000400573 in main ()还可用backtrace命令查看在栈中的什么位置,显示每一个激活的子函数的栈结构:(gdb) backtrace #0 0x0000000000

33、400573 in main ()通过输入q(quit)退出gdb模式:(gdb) qA debugging session is active.Inferior 1 process 3423 will be killed.Quit anyway? (y or n) y davidzdz:Graduation_project$第三章 设计的实现及主要技术3.1实现分析本节主要对设计的功能和设计思路进行简单的介绍3.1.1功能分析客户端的点点通信及文件的传送。主要包括Server端和Client端:1Server端:主要负责处理用户发送过来的消息,对用户的系列动作进行管理(登陆、注册、私聊、群聊

34、)和对用户的数据进行管理(查看用户的账户信息)。2.Client端:主要可以和其他用户私聊及群聊,还可以向其他用户发送文件。3.1.2设计分析服务器对Socket的初始化:网络协议的指定、端口的指定,具体步骤将在Socket中进行仔细介绍,等待用户连接。Client通过socket()初始化一个socket并向server发送请求连接。当服务器接收到用户的连接请求时,将为其开辟一个单独的新的线程,这条线程就为此用户服务。只有当用户退出时才将其释放。而服务器的主线程仍在等待其他用户的连接。系统设计大体框图如图3.1所示:3.1系统设计框图3.1.3技术分析基于以上简单的分析,Socket是实现C

35、/S通信的接口,且使用TCP/IP协议。TCP协议是面向连接的、传输可靠的,且对网络的适应能力较强,股本设计选用TCP,而不选用UDP。服务器要“同时”处理多个客户的请求,就得实现多任务并发。对于单个处理器来讲并发仅仅是概念上的,不是真正地同一时间处理多个任务,而是多个任务轮流依次执行,留给用户的感觉就好像在同时处理多个任务;而对于多喝CPU,则是真正意义上的并发执行,效率总的来说也有图单核CPU。线程并发的使用往往会牵涉到同步的问题,mutex能解决此类问题,当然最主要的还是Scoket函数调用。Ncurse终端字符界面大部分是由C+编写,使用它只要将其安装在本机上然后通过调用它的库函数即可

36、。3.2TCP/IP通信TCP/IP协议不同于OS模型,TCP/IP协议主要就以下几个部分:应用层、传输层、数据链路层和网络接口层。各层示意图如图3.2所示:图3.2 TCP各层示意图对于我们编程来说,没有必要完全掌握每一层的细节,只要知道:(1)每一层协议都是为下层向上层作转换(2)没有必要知道TCP的具体操作细节,也不要知道IP及数据链路层的具体操作细节(3)从应用程序的角度来看,仅仅把它们看成是Socket API就行了应用到应用之间的通信过程如图3.3所示:图3.3TCP/IP通信示意应用层:应用层的协议被大多数为用户提供服务的应用所使用,通过网络向低层交换应用数据。但这得包含一些基本

37、的网络支持服务,如许多路由协议和主机配置协议。例如,应用层常包含HTTP、FTP、SMTP、DHCP等协议。而且TCP/IP区分用户协议和支持协议;支持协议提供系统服务,而用户协议提供用户级应用程序,比方说FTP就是用户协议,DNS是系统协议。传输控制层:TCP/IP协议族中有两个传输层协议:UDP和TCP。User Datagram Protocol(UDP)是通过数据报的方式传输,Transmission Control Protocol (TCP) 是通过流的形式传输。数据链路层:从应用角度来看,我们通常可以忽略数据链接层,因为所有通信细节在驱动程序和硬件接口中处理。数据链路层(Data

38、-Link Layer)最重要的一个特性是最大传输单元Maximum transmission unit(MTU)。网络层:主要包括一下任务:将数据分成足够小的片段以便能够通过数据链路层进行传输(如果需要的话)通过Internet指定路径发送数据为传输层提供服务IPv4和IPv6IP以数据包的形式传送数据IP是无连接的和不可依赖的。为了建立连接,TCP常通过三次握手,三次握手示意图如图3.3.2:在客户机试图连接服务器时,服务器必须首先必须打开一个端口并对其进行绑定并监听;这通常叫做被动连接,一旦被动打开建立成功,客户机就可以初始化一个主动连接。为了建立一个连接,三次握手机制就起作用了:(1)

39、 SYN:Client向Server发送主动连接请求。Client设置序列号为随机值x(2) SYN_ACK:回应请求,server发送SYN-ACK。序列号被设置成+1,eg:x+1;此时server产生另外一个随机值y;(3) ACK:最终,client向服务器发送回应,接收到的序列号已经被设置成了x+1,server产生的序列号被设置成+1,eg:y+1。Client和Server都接收到了连接确认包。(1)(2)两步为单向(去)连接产生一个可识别的连接参数;(2)(3)是为其他方向(回)产生一个可识别的连接参数。通过这些步骤,一个全双工的通信就建立成功了。示意图如图3.4所示:图3.4

40、三次握手示意图3.3Socket(网络套接字)Socket API,提供了许多例程和函数供程序员使用,以此开发TCP/IP网络应用程序。就像pipe,Socket用文件描述符来表示,但是区别于Pipe的是,Socket支持在两个进程之间甚至同一网络中的不同机器上进行通信。Socket基本上可以理解为和其他机器进行通信;telnet,rlogin,ftp,talk等其他相似的网络程序都是用sockets。但并不是所有机器都支持Socket。在GNU库中,“sys/socket.h”存在于大多操作系统中,socket函数通常也都存在,但如果系统真的不支持socket,那么这些函数也就不会起作用了。

41、当创建socket时,你必须指定使用那种通信类型及该使用那种协议去实现它。不同的通信类型定义了发送和接收数据的用户级别,选择一个通信类型你得考虑一下几个方面:(1)传输的数据形式:bytes、packets(2)数据在传输过程中是否可以丢失:数据丢失程度不一样对最终的结果影响是不一样的;如果传输的数据不能丢失,那就得选用较可靠的协议。(3)通信是否是双向的:就像打电话和发邮件的区别。在两个程序,或许是不同的PC上进行数据传输得知道一下几点:(1)为了在两个socket间进行通信,这两个socket必须制定相同的协议(2)每个协议都有自己的专属定义,不能用其他协议的定义。(3)每个协议族都有一个

42、默认的协议,你可以通过指定0作为协议号。3.3.1编程步骤Server端:socket()、bind()、listen()、accept()、send()、recv()、close();Server端的编程步骤大体如上,建立连接后通过不断地创建线程为Client提供服务。Clent端:socket()、connect()、send()、recv();Client端成功连接服务器后,创建一个新的接收线程从服务器不断接收数据显示在不同的界面。3.3.2地址及顺序地址1、地址结构相关处理(1)数据结构介绍sockaddr结构体有两个成员:short int sa_family、char sa_dat

43、a14;其原型如下:struct sockaddr unsigned short sa_family; /*地址族*/char sa_data14; /socket地址数据的真正长度;sockaddr_in结构体有三个成员:sin_family、sin_addr、sin_port;其原型如下:struct sockaddr_in sa_family_t sin_family; /* address family*/ in_port_t sin_port; /* port number */ struct in_addr sin_addr; /* internet address */;一般情况

44、下,sockaddr_in结构体使用起来更加方便。(2)结构字段下表3.1列出了sa_family字段的常用值。表3.1 sa_family字段结构定义头文件#include Sa_familyAF_INET:IPv4 Internet protocolsAF_INET6:IPv6 Internet protocolsAF_LOCAL:Local communication2、数据存储优先级(1)函数说明不同的计算机为一个word的存储顺序使用不同的约定。有些计算机将最重要的字节放到一个字的最开始(大端),而有些则是放到一个字的最后(小端)。网络协议为传输的数据规定了字节顺序,这就是大家所熟知

45、的网络字节序。因此有时候就需要对其进行转化。用htons和ntohs为sin_port进行转化;用htonl和ntohl为sin_addr进行IPv4地址的转化。其中各个头字母的含义如下:h:host;n:network;s:short;l:long(2)函数格式说明下表3.2列出了这四个函数的语法格式:表3.2 htons等函数定义所需头文件#include #include(some sysytem)函数原型uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t

46、 netlong);uint16_t ntohs(uint16_t netshort);函数参数hostlong:主机字节序的32位数据hostshort:主机字节序的16位数据netlong:网络字节序的32位数据netshort:网络字节序的16位为数据函数返回值Success:返回要转换的字节序Error:-13、地址格式转化(1)函数说明用户习惯性输入的ip形式为:xxxx.xxxx.xxxx.xxxx或xxxx:xxxx:xxxx:xxxx,这两种格式虽能被用户识别,但是机器却无法识别,故只有将其转化成机器能识别的二进制格式。经常使用的有inet_aton、inet_addr、inet_pton、inet_ntop,其中后两个兼容IPV6。inet

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1