关于Linux网络编程课程设计.docx
- 文档编号:732026
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:34
- 大小:158.81KB
关于Linux网络编程课程设计.docx
《关于Linux网络编程课程设计.docx》由会员分享,可在线阅读,更多相关《关于Linux网络编程课程设计.docx(34页珍藏版)》请在冰点文库上搜索。
2011级通信工程
Linux网络编程课程设计报告
设计题目 基于Linux的网络通信
姓名 罗文强 20110343005
及 杨洁 20110343006
学号 何蕊 20110343007
学院 工程技术学院
专业 通信工程
班级 2011级3班
指导
方飞
教师
2014年6月29日
一、设计题目及要求
1、设计题目
基于Linux的网络通信
2、设计要求
(1)、设计整个网络系统的流程,并画出流程图。
(2)、设计发送数据包的格式。
(3)、学习linux环境下多进程或多线程的编程方法。
(4)、设计收发的模式、包括发送消息的内容。
(5)、设计多个客户端传送文件的方法。
指导教师签名:
2014年 月 日
二、指导教师评语
指导教师签名:
2014年 月 日
三、成绩
理论(60%):
分,作品(40%):
分,总分:
分。
验收盖章
2014年 月 日
摘要
本课程设计实现了在linux下简单的网络聊天室。
在Linux下编写并调试服务器端程序和客户端程序,实现了客户、服务器之间的连接和通信。
可以在单机上开辟两个窗口分别运行客户、服务器端的程序,或者将两台主机连接分别作为客户和服务器的方式。
本设计使用网络套接字socket和多线程在网络中的应用,并基于linux下的vi编辑器。
本方案经gcc调试器调试成功,可以在单机网络聊天中使用。
关键词:
linux;socket;vi
一、背景 4
1.1开发背景 4
1.2linux介绍 4
二、实验目的 6
三、实验步骤 6
3.1交叉编译平台的安装 6
四、设计原理 7
4.1设计原理流程 7
4.2程序流程分析 7
五、网络套接字(socket)的概念 9
5.1Socket介绍 9
5.2Socket原理简介 10
5.3Socket通信过程与程序开发 11
六、系统实现 16
6.1Linux提供的有关Socket的系统调用 16
6.2监听连接 18
6.3发送请求 19
6.4主机接收请求,进行数据通信 19
七、运行效果 19
一、背景
1.1开发背景
在网络无所不在的今天,在Internet上,有ICQ、MSN、Gtalk、OICQ等网络聊天软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发送信息,不管对方是否也同时在线,只要知道他有号码。
Linux操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!
只要是基于GNU公约的软件你都可以任意使用并修改它的源代码。
但对很多习惯于Windows操作系统的人来说,Linux的操作不够人性化、交互界面不够美观,这给Linux操作系统的普及带来了很大的阻碍。
因此制作一个Linux操作系统下的拥有人性化界面的实时通讯工具,将给那些刚刚接触Linux操作系统的用户带来极大的方便,而且通过设计这样的一个应用程序还能更好的学习网络编程知识和掌握LINUX平台上应用程序设计开发的过程,将大学四年所学知识综合运用,以达到检验学习成果的目的。
1.2linux介绍
Linux是一种针对PC计算机和工作站的操作系统,它具有像Windows和Mac那样的功能齐全的图形用户界面(GUI,GraphicalUserInterface)。
LinusTorvald和其它的遍布世界各地的编程人员共同开发的。
作为一种操作系统,它具有与Unix,Mac,Windows和Windows
NT同样的功能。
提到Linux我们不能不提GNU和Unix。
RichardM.Stallman建立的自由软件联盟出版了两种许可证,GNU通用公共许可证(GNUGneralPublicLicense,GPL)和GNU函数库通用公共许可证(GNULibraryGneralPublicLicense,LGPL)。
大部分GNU工程的软件和文档是以GNU通用公共许可证发行的,但是有一些库是以GNU函数库通用公共许可证发行的。
按照GNU通用公共许可证的规定,Linux的源代码可以自由获取,这满足了我们学习该系统的强烈愿望。
GPL充分体现了Stallman的思想:
只要用户所做的修改是同等自由的,用户可以自由地使用、拷贝、查询、重用、修改甚至发布这个软件。
通过这种方式,GPL保证
了Linux(以及同一许可证下的大量其他软件)不仅现在自由可用,而且皮后经过任何修改这后都仍然可以自由使用。
Unix是由AT—T贝尔实验室的KenThompson和DennisRitchie于1969年在一台已经废弃了的PDP-7上开发的;最初它是一个用汇编语言写成的单用户操作系统。
后来,他们又在PDP-11上用C语言重新编写(发明C语言的部分目的就在于此),把Unix做成为了一个文本处理系统,这使Unix在贝尔实验室得到广泛的应用。
Unix的最初版本免费提供给许多知名的大学的计算机系使用。
加州大学伯克利分校的计算机系就是其中的一名,并地Unix进行了修改增加了许多新的特点,这就是主为人知的BSC版本的Unix。
与此同时,其它独立开发的Unix版本也开始萌生。
Unix不断发展了,各种版本被应用到不同的计算机使用。
而Linux最初是专门为基于Intel的个人计算机设计的。
(1)Linux的昨天
1991年,一名叫LinusTorvalds的芬兰大学生对Unix各种版本对于80386类的机器的脆弱支持十分不满。
他决定要开发出一个全功能的、支持POSIX标准的、类Unix的操作系统内核,该系统吸收了BSD和SystemV的优点,同进摒弃了它们的缺点。
他独立把这个内核开发到0.02版,这个版本已经可以运行gcc、bash和很少的一些应用程序。
后来,他又开始了在因特网上寻求广泛的帮助。
1994年,Linux已经升级到1.0版本。
它的源代码量也呈指数形式增长,实现了基本的TCP/IP功能,此时Linux已经拥有大约10万的用户。
(2)Linux的今天
作为一各服务器级的操作系统,Linux已经成熟了。
现在的Linux内核由150多行代码组成,能作为Web服务器平台,也为越来越多的商业用户提供文件和打印服务。
它既被当作邮件服务器的一种候选平台,也被当作一种强壮而安全的防火墙。
Linux的企业级特性,比如支持多处理器、支持大型文件系统、日志文件系统以及密集型计算和高可用性集群技术,也逐步成熟。
桌面上的Linux也在继续完善。
KDE桌面提供的图形用户界面在易用性和可配置方面都能和微软的Windows相媲美。
(3)Linux的明天
Linux最强大的生命力在于其公开的开发过程。
每个人都有可以自由获取内核源程序,每个人都有要不得以运载源程序加以修改,而后他人也可以自由获取你修改后的源程序。
Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型)。
Bazaar开
发模型通过重视实验,征集并充分利用早期的反馈,对巨大数量的脑力资源进行平衡配置,可以开发出更优秀的软件。
本联盟就是想通过bazaar开发模型,在网上召集一些Linux的爱好者,开发出更优秀的操作系统或软件。
二、实验目的
2.1掌握ARMLinux交叉编译平台的搭建
2.2掌握Makefile文件的编写
2.3掌握编译工具arm-linux-gcc
2.4熟悉程序下载过程
三、实验步骤
3.1交叉编译平台的安装
(1)考虑到现今Linux平台发展,交叉编译平台编统一为arm-linux-gcc-4.4.3
(2)在windows系统下,建立一个共享目录,如:
e:
/linux_file
(3)将光盘目录linux\中的arm-linux-gcc-4.4.3.tar.gz复制到e:
/linux_file
(4)注意在进行虚拟机设置时使共享目录的有效,并添加共享目录e:
/linux_file
(5)进入linux操作系统,root目录下建立一个Armcode的子目录,将共享目录下的文件arm-linux-gcc-4.4.3.tar.gz复制到该目录
(6)然后进入到该目录,执行解压命令:
#cd/root/Armcode;
#tarxvzfarm-linux-gcc-4.4.3.tgz–C/;注意:
C后面有个空格,并且C是大写的,它是英文单词“Change”的第一个字母,在此是改变目录的意思。
(7)执行该命令,将把arm-linux-gcc安装到/opt/FriendlyARM/toolschain/4.4.3/bin
目录。
(8)把编译器路径加入系统环境变量,运行命令:
#gedit/root/.bashrc
编辑/root/.bashrc文件,在最后一行添加:
exportPATH=$PATH:
/opt/FriendlyARM/toolschain/4.4.3/bin
(9)重新登录系统(不必重启机器,开始->logout即可),使以上设置生效,在命令行输入:
arm-linux-gcc –v,会出现如下信息,这说明交叉编译环境已经成功安装。
四、设计原理
4.1设计原理流程
网络编程,一定离不开套接口;那什么是套接口呢?
在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述符通信的一种方法。
服务器端:
(1)创建一个socket,用函数socket();
(2)绑定IP地址、端口等信息岛socket上,用函数bind();
(3)设置应许的最大连接数,用函数listen();
(4)接收客户端上来的链接,用函数accept();
(5)接收数据,用recv();
(6)关闭网络链接。
客户端:
(1)创建一个socket,用函数socket();
(2)设置要连接的对方的IP地址和端口等属性;
(3)连接服务器,用函数connect();
(4)发送数据,用函数send();
(5)关闭网络连接。
4.2程序流程分析
(1)创建Socket
不管是客户端还是服务器端,都需要先创建一个socket。
调用方式为:
intsocket(intdomain,inttype,intprotocol)
功能:
创建一个新的套接字。
参数:
domain:
指明所使用的协议族
type:
指明套接字的类型
protocol:
通常赋值“0”
返回值:
成功时,返回一个整形socket描述符;失败时,返回-1。
设计过程具体调用为:
sock_fd=socket(AF_INET,SOCK_STREAM,0);
(2)服务器端使用的函数
1)intbind(intsockfd,structsockaddr*my_addr,intaddrlen)sockfd:
是由socket调用返回的文件描述符。
Addrlen:
是sockaddr结构的长度。
my_addr:
是一个指向sockaddr的指针。
由于我们主要使用Internet所以sin_family一般为AF_INET,sin_addr设置为
INADDR_ANY表示可以和任何的主机通信,sin_port是要监听的端口号,sin_zero[8]是用来填充的。
bind将本地的端口同socket返回的文件描述符捆绑在一起,成功是返回0。
2)intlisten(intsockfd,intbacklog)sockfd:
是bind后的文件描述符。
backlog:
设置请求排队的最大长度,当有多个客户端程序和服务端相连时,使用这个表示可以介绍的排队长度。
listen函数将bind的文件描述符变为监听套接字,返回的情况和bind一样。
3)intaccept(intsockfd,structsockaddr*addr,int*addrlen)sockfd:
是listen后的文件描述符。
addr,addrlen:
是用来给客户端的程序填写的,服务器端只要传递指针就可以了。
bind、listen和accept是服务器端用的函数,accept调用时服务器端的程序会一直阻塞到有一个客户程序发出了连接。
accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了,失败时返回-1。
4)intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)
sockfd:
socket返回的文件描述符。
serv_addr:
储存了服务器端的连接信息,in_add是服务端的地址。
addrlen:
serv_addr的长度。
connect函数是客户端用来同服务端连接的,成功时返回
0,sockfd是同服务端通讯的文件描述符,失败时返回-1。
(3)客户端使用的函数
1)connect(SOCKETs,conststructsockaddrFAR*name,intnamelen);s:
标识一个未连接套接口的描述字。
name:
欲进行连接的端口名。
namelen:
名字长度。
若无错误发生,则connect()返回非0。
否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
对阻塞套接口而言,若返回值为
SOCKET_ERROR则应用程序调用WSAGetLsatError()。
如果它指出错误代码为WSAEWOULDBLOCK,则您的应用程序可以:
a.用select(),通过检查套接口是否可写,来确定连接请求是否完成。
b.如果您的应用程序使用基于消息的WSAAsynSelect()来表示对连接事件的兴趣,则
当连接操作完成后,您会收到一个FD_CONNECT消息。
2)send(SOCKETs,constcharFAR*buf,intlen,intflags);s:
一个用于标识已连接套接口的描述字。
buf:
包含待发送数据的缓冲区。
len:
缓冲区中数据的长度。
flags:
调用执行方式。
五、网络套接字(socket)的概念
5.1Socket介绍
上世纪中后期,在美国国防部高研署(DARPA)将TCP/IP的软件提供给加利尼亚大学Berkeley分校后,TCP/IP很快被集成到Unix中,同时出现了许多成熟的TCP/IP应用程序接口(API)。
这个API称为Socket接口(套接口)。
Socket在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。
应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。
在应用开发中就像使用文件句柄
一样,可以对Socket句柄进行读、写操作。
今天,Socket接口是TCP/IP网络最为
通用的API,也是在Internet上进行应用开发最为通用的API。
Linux操作系统具有良好的稳定性和出色的网络性能,因此被广泛应用于网络服务领域。
而在Linux下开发高性能的网络通信程序,是充分发挥Linux网络特性的一个关键因素。
5.2Socket原理简介
当用电话与他人通信时,必须拿起话筒,拨叫对方的电话号码,然后等待对方的应答;当双方进行通话的时候,就建立了一个具有两个端点的通信线路,这两个端点是:
本地的电话号码(在本地位置);对方的电话号码(在对方的位置处)。
双方的通信与通信的两个端点和他们之间的通信线路有关。
Linux中的套接口与电话非常相似。
套接口代表通信线路中的端点,两端点之间就是数据通信网络。
套接口与电话的相似性还表现在另一方面。
当给某人打电话时,拨叫的是对方用户的电话号码。
而套接口中的网络地址就相当于电话号码。
通过在程序中指定远程套接口的地址,就可以建立从本地套接口到
远端套接口的通信。
TCP/IP是计算机互连最常使用的网络通讯协议,TCP/IP的核心部分由网络操作系统的内核实现,应用程序通过编程接口来访问TCP/IP。
套接字(
Socket)是介于网络应用层和传输层之间的编程接口,套接字接口提供了访问下层通信协议的大量系统调用和相应的数据结构。
在Linux中,套接字接口是应用程序访问下层的网络协议的惟一方法。
具体讲,套接字在用户级实现了两个应用程序之间的网络连接和数据交换,所以Linux中的套接字意味着网络上的连接。
套接字在TCP/IP网络模型中的地位如图4所示。
图4socket在TCP/IP网络模型中的示意图
Socket分为以下三种类型:
流式套接字(StreamSocket):
是最常用的套接字类型,文件传送协议(FTP)即使用流式套接字。
提供一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。
内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。
数据报套接字(DatagramSocket):
TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,数据通过相互独立的报文进行传输,提供了一个无连接服务。
数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
原始数据报套接字(RawSocket):
该接口允许对较低层协议,如IP、ICMP直接访问。
常用于检验新的协议实现或访问。
5.3Socket通信过程与程序开发
(1)Socket通信过程
基于TCP可靠连接的客户与服务器连接进程流程图如图
客户与服务器的socket连接步骤流程
Socket工作过程如下:
服务器首先启动,通过调用Socket(),建立一个Socket,然后调用bind()将该Socket和本地网络地址绑系在一起,再调用listen()使Socket做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。
客户在建立Socket后就可调用connect()和服务器建立连接。
连接一旦建立,客户机和服务器之间就可以通过调用send()和recv()来发送和接收数据。
最后,待数据传送结束后,双方调用close()关闭
Socket。
(2)Socket通信程序开发
下面详细说明Socket通信程序的开发过程:
1)步骤1:
建立套接口socket()
intsockfd=socket(intdomain,inttype,intprotocol),其中domain参数指定
socket协议族,包括PF_LOACL和PF_INET,PF_LOACL表示使用本地套接口,PF_INET表示使用Internet套接口。
Type参数定义了套接口的类型,包括SOCK_STREAM和SOCK_DGRAM,SOCK_STREAM指定为流套接口,SOCK_DGRAM指定为数据报套接口。
protocol通常赋值“0”,意味套接口使用TCP/IP协议。
socket()调用返回一个整型
socket描述符,可以在后面的调用使用它,当其值为-1时,说明有错误发生。
2)步骤2:
绑定套接口bind()
当用socket()建立套接口后,该套接口还是处于无名状态的,无名套接口就象没有号码的电话一样,别人无法向发送信息(在同一linux内核下可实现无名状态下通信)。
为了像电话分配电话号码一样,可以通过bind()为建立的套接口绑定一个名字———分配地址。
这一步对客户端不是必需的。
intbind(intsockfd,structsockaddr_my_addr,
intaddrlen);sockfd是一个socket描述符,my_addr是一个指图计算机应用向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(structockaddr),如果函数调用成功,就返回0,否则就返回为-1,我们可以通过查看errno的值来了解错误的原因。
需要指出的是,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号:
my_addr.sin_port=0;/<系统随机选择一个未被使用的端口号
my_addr.sin_port置为0,函数会自动为选择一个未占用的端口来使用。
同样,通过将
my_addr.sin_addr.s_addr置为INADDR_ANY,系统会自动填入本机IP地址。
bind()函数在成功被调用时返回0;遇到错误时返回“-1”并将errno置为相应的错误号。
另外要注意的是,当调用函数时,一般不要将端口号置为小于1024的值,因为1~1024是保留端口号,可以使用大于1024中任何一个没有被占用的端口号。
(3)步骤3:
请求连接
connect()当客户端绑定地址后,发送请求连接信号connect()来与远端服务器建立一个TCP
连接。
connect()函数原型为:
intconnect(intsockfd,structsockaddr ;sockfd是目的服务器的socket描述符;serv_addr是包含目的机IP地址和端口号的指针, addrlen为结构的大小。 遇到错误时返回-1,并且errno中包含相应的错误码。 进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,内核会自动选择一个未被占用的端口供客户端来使用。 (4)步骤4: 监听连接listen()在服务器端程序中,当socket
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 Linux 网络 编程 课程设计