《计算机通讯与网络》实验讲义

更新时间:2024-01-10 01:43:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《计算机通讯与网络》

实验讲义

谷振宇 郭茂耘

重庆大学 自动化学院

2005年6月

目 录

目 录

实验一:常用双机互连方法 .............................................................. 1 实验二 简单局域网构建 .................................................................. 5 实验三 路由器设置模拟 .................................................................. 9 实验四:实验五:点对点网络通信编程CRC校验码生成 ............................................................... 12 ........................................................ 17

- I -

实验一:常用双机互连方法

一、实验名称:常用双机互连方法

二、实验目的:学会利用直通线、交叉线、集线器在两台工作站之间建立通信连接。 三、实验内容

1. 制作直连网线和交叉线; 2. 利用计算机串口将计算机互连; 3. 利用网线将计算机互连。 4. 利用Hub将计算机互连。 四、实验设备

1. 微机 2. 网卡 3. RJ45头 4. 压线钳 5. Hub 6. 未制作网线 7. 网络测试仪 8. RS232串口线 四、预习内容

1.了解5类网线基本知识 2.连线的制作

3.Windows2000下利用串口互连方法。 五、实验步骤 (一)双机直连

1.制作一根反线 2.用测试仪测试 3.连接两台计算机

4.分别对所连的两块网卡进行设置

5.用 Windows2000自带的Ping 命令Ping对方IP (二)RS232串口连接两台计算机

1.用所发的串口线把两台计算通过串口连结起来 2.对所连的串口进行设置 3.对出现的连接进行属性设置

- 1 -

4.客户机拨主机,检测连通性 (三)用HUB连接计算机

1.两台计算机用HUB组网 2.两组之间通过HUB级连 3.多组之间通过HUB级连 六、实验说明

1、我们将连接计算机和集线器的网线称为正线(Normal Line)。将连接计算机和计算机的网线称为反线(级联线)。正线两端线序的排列相同(具体线序参见附录二:制作网线)

2、用网线连结计算机时,此时的TCP/IP配置是对\本地连接\进行的,用串口线连结计算机时,此时的TCP/IP配置是对新建连结所产生的“连接”进行的。

3、网卡的TCP/IP配置方法:用右键单击\网上邻居\,选中菜单中\属性\项后左键单击,出现“网络和拨号连接”,右击“本地连接”图标,再弹出的快捷菜单中选择“属性”,显示网络属性菜单 选定TCP/IP,然后单击\属性\项,显示TCP/IP属性菜单,选择IP地址页,选择\指定IP地址\,填入\机器号。子网掩码填入\,如需添加一个以上IP,点击“高级”,添加IP,然后关闭TCP/IP属性。

4、对所连的串口进行设置方法:右击“网上邻居”属性,打开“网络和拨号连接”的窗口,点击“新建连接”。出现“网络连接向导”,在“位置信息”中输入“区号”(注意一定要输),点击“确定”,在“拨号规则”对话框点击“确定”,接着在“网络连接向导”\对话框中,点击“下一步”,在“网络连接类型中”选中\直接连接到另一台计算机\,点击“下一步”,在“主机或来宾”对话框中选择“主机”或“来宾”(一台电脑只能充当一个角色)。一台计算机担当主机、另一台计算机担任来宾角色。主机用于接受来宾的访问,可以设置IP池,为来访的来宾分配TCP/IP。,点击“下一步”,在\连接设备\中我们选择\通讯端口(com1或com2,根据自己的实际接线)\,点击\下一步\, 在\允许的用户\中我们选择 \,根据需要,可以选择任意账号进行访问控制,点击\下一步\, 最后出现“完成网络连接向导”,点击“完成”,安装完毕后 \网络和拨号连接\中会有\传出/传入的连接\。

5、对所连的串口进行设置出现的连接进行属性设置方法:在\传出/传入的连接\,点鼠标右键,在右键快捷菜单中选择\属性\,在\属性\菜单栏中选\网络\菜单,接着对\协议(TCP/IP)\进行设置;在\属性\菜单栏中选\用户\菜单进行设置。配置结束后,进行两台计算机的连接,如同拨号访问,连接成功后,检测连通性。

6、为了保证在组网时,各组计算机能够顺利交换信息,在此规定每台计算机的IP地址都不能相同,如第一台计算机IP地址设为192.168.1.1子网掩码为255.255.255.0,计算机名为qdi01,工作组为jk。第二台计算机的IP地址设为192.168.1.2,子网掩码为255.255.255.0, 计算机名为qdi02,工作组为jk。第三台、第四台计算机等如此类推。

- 2 -

7、用软件测试连通性最常用的办法, 就是用 Windows2000自带的Ping 命令(这需要进行TCP/IP的设置方可)。 如果工作站得到服务器的响应则表明线路正常和网络协议安装正常, 而这是网络应用软件能正常工作的基础。

8、两组或多组之间通过HUB级连实现局域网的扩展时需要各组同学之间的配合。注意Hub的级连口和级连控制开关,一般情况下,级连控制开关弹起,则级连口如同一般的连接口,可以进行计算机连接,如果将级连按钮按下,则级连口只能作为Hub之间互联的端口,不可以作为一般计算机互连口了;还有一种是有一个级连口,同时又第8口,但这两个口只能用一个。对于带智能型的SWITCH则不同于HUB,他不区分普通口和级连口。级连时,只需用一根普通线将两台SWITCH连结就可以了,也可以用堆叠模块把两台SWITCH连结起来作为一台SWITCH来管理。 附录一:有关EIA/TIA-568标准

EIA/TIA的布线标准中规定了两种双绞线的线序568A与568B:

标准568A:橙白--1,橙--2,绿白--3,蓝--4,蓝白--5,绿--6,棕白--7,棕--8; 标准568B:绿白--1,绿--2,橙白--3,蓝--4,蓝白--5,橙--6,棕白--7,棕-8; 在整个网络布线中应用一种布线方式,但两端都有RJ-45 plug 的网络联线无论是采用端接方式A,还是端接方式B, 在网络中都是通用的。双绞线的顺序与RJ45头的引脚序号--对应。10M以太网的网线使用1,2,3,6编号的芯线传递数据,100M以太网的网线同时还使用4,5,7,8编号的芯线传递数据。 100BASE-T4 RJ-45对双绞线的规定如下:

1、2用于发送,3、6用于接收,4、5,7、8是双向线。 附录二:制作网线

步骤 1:利用斜口钳的剥线口将所给双绞线的外皮剥去2-3厘米。

有一些双绞线电缆上含有一条柔软的尼龙绳,如果您在剥除双绞线的外皮时,觉得裸露出的部分太短,而不利于制作RJ-45接头时,可以紧握双绞线的外皮,再捏住尼龙线往外皮的下方剥开,就可以得到较长的裸露线。

步骤2:接下来就要进行拨线的操作。将裸露的双绞线按橙、绿、蓝、棕(B标准按绿、橙、蓝、棕)四对线从左向右排列;

步骤3:小心地剥开每一对线,这里注意每一对浅色线在前深色线在后。排列如下 (以A标准为例)左起:白橙/橙/白绿/绿/白蓝/蓝/白棕/棕 (以B标准为例)左起:白绿/绿/白橙/橙/白蓝/蓝/白棕/棕

步骤4:把第二对线分开,第三对线包中间,第三对线的深色线与浅色线对调,(A标准为:白橙/橙/白绿/蓝/白蓝/绿/白棕/棕;B标准为:白绿/绿/白橙/蓝/白蓝/橙/白棕/棕)。

常见的错误接法是将绿色线放到第4只脚的位置。应该将绿色线放在第6只脚的位置才

- 3 -

是正确的,因为在100BaseT网络中,第3只脚与第6只脚是同一对的,所以需要使用同一对残。

(错误方法)左起:白橙/橙/白绿/绿/白蓝/蓝/白棕/棕 (A标准) 白绿/绿/白橙/橙/白蓝/蓝/白棕/棕(B标准)

步骤 5:将裸露出的双绞线用剪刀或斜口钳剪下只剩约14mm的长度(注意:剪完线之后手就不要再动了,排完线向水晶头插入时,要求铜片向上,插入口朝向自己),最后再将双绞线的每一根线依序放入RJ-45接头的引脚内,第一只引脚内应该放白橙色的线,其余类推, 步骤6:确定双绞线的每根线已经正确放置(排线顺序是否正确,每根线是否顶到头)之后,就可以用RJ-45压线钳压接RJ-45接头,这样一个头就做好了,再做另一个头。(注意:另一个头的排线顺序)

注意:有一种RJ-45接头的保护套,可以防止接头在拉扯时造成接触不良。使用这种保护套时,需要在压接RJ-45接头之前就将这种胶套插在双绞线电缆上。

- 4 -

实验二 简单局域网构建

一、实验名称:简单局域网构建 二、实验目的:掌握设计简单以太网的拓扑结构图的方法,并能够根据需求设计拓扑结构图;了解办公环境中布线的基本要求,并能够根据实际情况绘制布线图。 三、实验内容

1. 根据实验要求设计拓扑结构图; 2. 以实验机房为例绘制布线图。 四、实验设备

1. 微机 四、预习内容

1.了解防火墙、交换机等网络设备的基本知识; 2.组建简单以太网的基本知识; 3. 结构化布线的概念和设计规范。 五、实验步骤 (一)设计拓扑结构图

1.需求分析 2.总体方案设计 3.拓扑结构设计 (二)绘制布线图

1.需求分析 2.土建结构分析 3.设计布线图 六、实验要求

1. 设计实验机房的网络拓扑结构图,并标注相关节点的ip。要求通过代理服务器接入

互联网,,机房的应用服务器和数据库服务器等服务器配置在安全区;教师机接到主交换机接口,实验机房的机器接入级联交换机;接入外网的ip是202.202.5.11,网关是202.202.5.128;要求内网的网关为192.168.0.1。 2. 以实验机房目前节点的位置为例绘制布线图。 七、实验说明 (一)结构化布线

1.定义

结构化布线系统是一个能够支持任何用户选择的话音、数据、图形图像应用的电信布线系统。系统应能支持话音、图形、图像、数据多媒体、安全监控、传感等各种信息的传输,支持UTP、光纤、STP、同轴电缆等各种传输载体,支持多用户多类型产品的应用,支持高速

- 5 -

网络的应用。

2.特点

结构化布线系统具有以下特点:

1)实用性:能支持多种数据通信、多媒体技术及信息管理系统等,能够适应现代和未来技术的发展;

2)灵活性:任意信息点能够连接不同类型的设备,如微机、打印机、终端、服务器、监视器等;

3)开放性:能够支持任何厂家的任意网络产品,支持任意网络结构,如总线形、星形、环型等;

4)模块化:所有的接插件都是积木式的标准件,方便使用、管理和扩充;

5)扩展性:实施后的结构化布线系统是可扩充的,以便将来有更大需求时,很容易将设备安装接入;

6)经济性:一次性投资,长期受益,维护费用低,使整体投资达到最少。 3.布线系统的构成

按照一般划分,结构化布线系统包括六个子系统:工作区子系统、水平支干线子系统、管理子系统、垂直主干子系统、设备子系统和建筑群主干子系统。

1)建筑群主干子系统

提供外部建筑物与大楼内布线的连接点。EIA/TIA569标准规定了网络接口的物理规格,实现建筑群之间的连接。 2)设备子系统

EIA/TIA569标准规定了设备间的设备布线。它是布线系统最主要的管理区域,所有楼层的资料都由电缆或光纤电缆传送至此。通常,此系统安装在计算机系统、网络系统和程控机系统的主机房内。 3)垂直主干子系统

它连接通讯室、设备间和入口设备,包括主干电缆、中间交换和主交接、机械终端和用于主干到主干交换的接插线或插头。主干布线要采用星形拓扑结构,接地应符合EIA/TIA607规定的要求。 4)管理子系统

此部分放置电信布线系统设备,包括水平和主干布线系统的机械终端和1或交换。 5)水平支干线子系统

连接管理子系统至工作区,包括水平布线、信息插座、电缆终端及交换。指定的拓扑结构为星形拓扑。

水平布线可选择的介质有三种(100欧姆UTP电缆、150欧姆STP电缆及62.5/125微米光缆),最远的延伸距离为90米,除了90米水平电缆外,工作区与管理子系统的接插线和

- 6 -

跨接线电缆的总长可达10米。 6)工作区子系统

工作区由信息插座延伸至站设备。工作区布线要求相对简单,这样就容易移动、添加和变更设备。

4.介质及连接硬件的性能规格

在结构化布线系统中,布线硬件主要包括:配线架、传输介质、通信插座、插座板、线槽和管道等。

5.布线示意图举例

InternetSwitchIBM 6611/170电源IBM 6611/170IBM 6611/170IBM 6611/170双网卡:外网卡IP:202.202.5.11外网卡网关:202.202.5.128内网卡IP:192.168.0.1内网卡网关:192.168.0.1UPSU.P.S.TerminalTerminalTerminal网卡IP:192.168.0.2网卡网关:192.168.0.1HUBTerminalTerminalTerminalTerminalTerminalTerminalTerminal主讲人用研讨、培训室TerminalTerminalTerminal

(二)拓扑结构图

1.网关:网关(Gateway)就是一个网络连接到另一个网络的“关口”。在这里我们所讲的“网

- 7 -

关”均指TCP/IP协议下的网关。网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,TCP/IP协议会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。

所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。 2.拓扑结构图示例 192.168.1.1

研究室 集中12节点

工作室 分散24节点

培训室 集中16节点

VLAN2 VLAN3 管理员 HUB VLAN1 内部网络 Switch Mail Web LDAP DB 202.202.5.11 FW4000 SSN网络- Firewall Switch Cisco2950 192.168.0.1 Internet Router 202.202.5.128 - 8 -

实验三 路由器设置模拟

一、实验名称:路由器和交换机的配置

二、实验目的:掌握路由器和交换机的配置方法。 三、实验内容

1. 路由器配置; 2. 交换机配置。 四、实验设备

1. 微机

2. Sybex Virtual Lab软件 四、预习内容

1. 了解路由器、交换机的基本知识和工作原理; 2. Sybex Virtual Lab软件的安装和使用方法; 3. 理解路由器、交换机工作的相关知识。 五、实验步骤

1. 安装思科虚拟实验系统软件并运行;

2. 根据实验要求配置routerA、routerB、routerC; 3. 根据实验要求配置交换机; 4. 使用ping 命令测试网络的连通性。

六、实验说明

(一)路由器配置模式

1.一般用户模式

? 只限于路由器的某一些有限的权限登录到机器的缺省状态 ? router> 2.超级权限模式

? 有检查,配置,调试等所有权限 ? 通过enable可进入此状态 ? router# 3.全局设置状态

? 在特权执行态输入config terminal则进入该态 ? router(config)# 4.其他的设置状态

? 在特权执行状态输入相应的命令时进入 ? 例如:interface serial 2/0 ? router(config-mode)#

(二)路由器配置基本操作

1.用户模式进入特权模式:Router>enable

2.特权模式进入全局配置模式: Router#config t 按Ctrl-Z或输入Exit退出 3. 路由器命名:Router(config)# hostname routerA

- 9 -

4. 设置密码:routerA (config)#enable password cisco 5. 以太端口初始设置:routerA (config)#int e0

设置ip地址:routerA (config-if)#ip address 192.168.0.1 255.255.255.0 在默认情况下,cisco路由器的接口是在关闭状态下的,我们需要键入“no shutdown”命令来激活接口。router(config-if)#no shutdown 6.配置串口

进入全局配置模式:Router#config t

指定某个端口:Router(config)#int serial 0

设置ip地址:routerA (config-if)#ip address 192.168.0.1 255.255.255.0 设置时钟频率: (只在DCE端)Router(config-if)#clock rate 64000 7.设置静态路由

进入全局配置模式:Router#config t

设置路由:Router(config)#ip route 172.16.1.0 255.255.255.0 172.16.2.1

? 172.16.1.0:目的地址 ? 255.255.255.0:子网掩码

? 172.16.2.1:下一跳的IP地址,也称为网关,离本子网最近的路由器接

口地址 8.保存 :Router#copy running-config startup-config (三)交换机配置基本操作

通过终端连接到交换机,打开交换机后显示如下: Catalyst 1900 Management Console

Copyright (c) Cisco Systems, Inc。 1993-1999 All rights reserved。

Standard Edition Software

Ethernet address: 00-E0-1E-7E-B4-40 PCA Number: 73-2239-01

PCA Serial Number: SAD01200001 Model Number: WS-C1924-A System Serial Number: FAA01200001

-------------------------------------

User Interface Menu

[M] Menus //主配置菜单

[I] IP Configuration //IP地址等配置 [P] Console Password //控制密码配置

Enter Selection: //在此输入要选择项的快捷字母,然后按回车键确认 【注】“//”后面的内容为笔者对前面语句的解释,下同。

至此就正式进入了交换机配置界面了,下面的工作就可以正式配置交换机了。

配置交换机基本操作步骤:

1.用户模式进入特权模式: >enable

2.特权模式进入全局配置模式: #config t 按Ctrl-Z或输入Exit退出 3. 交换机命名: (config)# hostname switch

4.设置密码:switch (config)#enable password cisco 6. 端口初始设置

查看端口名:switch#show interface

- 10 -

特权模式进入全局配置模式: switch#config t 配置端口: switch(config)#int Ethernet 0/1

设置ip地址:switch (config-if)#ip address 192.168.0.1 255.255.255.0 键入“no shutdown”命令来激活接口。switch (config-if)#no shutdown

七、实验要求

3. 要求各网络设备的ip如下: routerA routerB routerC Switch 1900 E0 202.202.10.1 E0 192.168.10.1 S0 202.202.20.1 S0 202.202.20.2 S1 168.172.10.1 E0 192.168.10.1 202.202.10.2 S0 168.172.10.2 4. 实验网络拓扑结构图如图所示(与软件中的网络结构图相同)

- 11 -

实验四:CRC校验码生成

一、实验名称: CRC校验码生成

二、实验目的:通过编程,实现CRC码的生成,以加深对CRC码的校验原理和CRC生成方法理解。

三、实验内容

设计一个程序,实现CRC码的生成 四、实验设备

1.微机(带相关编程软件) 五、预习内容

1.CRC码基本知识 2.相关编程语言 六、实验步骤

1.熟悉CRC码的生成原理 2.设计程序流程图

3.根据程序流程图编写代码 4.调试运行程序

七、实验说明

在局域网络技术中常用的检错码是循环冗余校验CRC (Cyclic Redundancy Check)码。CRC码由信息码加上校验码组成。信息码在前,校验码接其后。如一个码有k位信息码,r位校验码,组成长度为n=k+r的CRC码,可记为(n,k)。校验位个数常用的有12,16和32位,一般附加的校验位数越多,检错能力就越强,但传输的额外开销也越大。

任何一个二进制位串组成的代码都可以用一个多项式来表示,多项式的系数只有0和1,n位长度的码C可以用下列多项式表示:

该多项式称为码多项式。

对于CRC码(n,k),信息码对应一个(k-1)次多项式K(x),校验码对应一个(r一1)次

C(x)?Cn?1xn?1?Cn?2xn?2?????C1x?C0多项式R(x),则C(x)由下式构成:

C(x)?xrK(x)?R(x)其中,

xrK(x)R(x)为的余数,G(x)为生成多项式G(x)在接收端将接收到的C(x)除以生成多项式的G(x),若余数为零,则认为传输无误;若余数不为零,则认为检验出传输差错。

- 12 -

附:参考程序(C语言)

int GetLength(char *str)//求*str 的长度 {

int Length; Length=0;

while(*(str+Length)!='\\0') {

Length++; }

return Length; }

void CharShift(char *result,char *source, int sourcelength,int resultlength)

//将串*source char左移resultlength-sourcelength位,结果存放在*result {

int i; char t;

for (i=0;i

if(i

t=*(source+i); *(result+i)=t; } else {

*(result+i)='0'; } }

*(result+i)='\\0'; }

void Xor(char *source1, char *source2, char *result, int resultlength) //将 *source1和*source2按位异或,结果存放在*result中 {

char t; int i=0;

while(*(source1+i)!='\\0') {

t=*(source2+i); if(*(source1+i)==t)

- 13 -

*(result+i)='0'; else

*(result+i)='1'; i++; }

*(result+i)='\\0'; }

int GetHeadZeros(char *result,int length) //返回串*result中的左边的连续0的个数 {

int torf;

int headzeroscount; int j;

headzeroscount=0; torf=0;

for (j=0;j<=length;j++) {

if(*(result+j)=='0') headzeroscount++; else

j=length+1; }

return (headzeroscount); }

void GetChar(char *source,char *result,int count) //从*source中取count位存放在*result中 {

char t; int i;

for (i=0;i

t=*(source+i); *(result+i)=t; }

*(result+i)='\\0'; }

void CharSub(char *source, int sourcelength,int sublength) //在*source中切去左边sublength位 {

- 14 -

char t; int i;

for (i=0;i

t=*(source+i+sublength); *(source+i)=t; }

*(source+i)='\\0'; }

main() {

char *CodeSource=\ char *CodeCRC=\

char Result[20]={\ //char *temp=\

char CodeSec[20]={\ char CodeShift[20]={\ char temp[20]={\ int CodeSourceLength; int CodeCRCLength; int i;

int headzeros; int Length; char t;

CodeCRCLength=GetLength(CodeCRC);

CodeSourceLength=GetLength(CodeSource);

CharShift(temp, CodeSource, CodeSourceLength, CodeCRCLength);

while (GetLength(temp)>=CodeCRCLength) {

CodeSourceLength=GetLength(temp); GetChar(temp,CodeSec,CodeCRCLength);

CharSub(temp, CodeSourceLength, CodeCRCLength); Xor(CodeSec, CodeCRC, Result, CodeCRCLength);

Length=GetLength(Result);

headzeros=GetHeadZeros(Result,Length); CharSub(Result, Length,headzeros); strcat(Result,temp);

Length=GetLength(Result);

- 15 -

}

}

for(i=0;i<=Length;i++) {

t=*(Result+i); *(temp+i)=t; }

for(i=0;i

if(i

t=*(CodeSource+i); *(Result+i)=t; } else {

t=*(temp+i-CodeSourceLength-1); *(Result+i)=t; } }

*(Result+i)='\\0';

- 16 -

实验五:点对点网络通信编程

一、实验名称:点对点网络通信编程

二、实验目的:通过编程,实现点对点网络通信,以巩固对基于SOCKET编程原理,初步掌握SOCKET编程。 三、实验内容

设计一个程序,实现点对点网络通信编程。 四、实验设备

1.微机(带相关编程软件) 五、预习内容

1. SOCKET基本知识 2.相关编程语言 六、实验步骤

1.基于SOCKET的点对点通信过程 2.设计程序流程图

3.根据程序流程图编写代码 4.调试运行程序

七、实验说明

Socket是网络在传送层上提供给应用程序的接口之一,其目的主要是网络上进程通信。 Socket通过域(domain)来划分所支持的协议。目前的域只支持三种协议:UNIX域支持在UNIX系统中的进程通信;互连网(Internet)域支持TCP/IP协议Xerox域支持Xerox公司的

XNS协议。

Socket的实现者试图以UNIX文件的操作语义来模仿进程通信的操作,而将网络通信的进程看成是网络上两端口的I/O操作,为此定义了类似于文件描述符的Socket描述符。文件中输人输出的系统调用read, write均通过文件描述符来操作,然而网络设备的接口若要维护UNIX文件系统的文件描述符语义,都是相当困难的。

将网络通信看成网络I/0操作要比文件I/0考虑更多的问题,其实质是网络上进程通信首先应在进程伺建立一种联系。联系可以是面向连接的,也可以是非连接的,而建立进程间的联系与取得文件描述符在过程和操作上都有着很大的差异。

网络I/O中描述符必须与通信信道另一端进程地址相联系,屏蔽掉差异意味着描述符与进程地址的联系过程完全由核心负责,而不是由用户来负责(文件系统中由描述符寻找打开文件i节点的过程由核心完成)。由于网络连接需要指定多个参数。不同的协议,这些参数的个数和每个参数的语义都是不同的,此外,网络连接的建立也需有多次“握手”(常把client方发一个请求或者server方发一个应答,叫握手)。若将这些过程全部包容在一个系统调用(例如,Socket())中,是完全不可取的。

为此,Socket的实现提供了多个由应用程序维护的系统调用,来建立进程间的网络连接。

另外,Socket描述符与进程地址的联系也由应用程序使用系统调用来显式地维护。Socket机制虽然没有实现完全的文件操作语义,但其操作方式还是与文件操作有着许多对应,例如,Socket()调用可近似地看成是open()调用,Socket中也使用了read和write调用,而其语法和语义与文件的read和write已调用几乎完全一致。

Socket中的调用bind, connect, listen和accept显示了建立网络连接的方法,Socket进程通信仍使用client _ server模型,建立连按时client和server所做的工作是不对称

- 17 -

的。在使用基于Socket的系统调用实现进程通信的主要有两类:一类是面向连接的进程通信,另一类是非连接的进程通信,且注意到两者使用的系统调用有所不同。

常用的Socket基本调用有: 1.Socket建立调用:

sockfd=Socket(family,type,protocol) int sockfd;

int family,type;… int protocol;

参数family指出了Socket所处的通信域。前文已讲过目前支持三种通信域。表1显示了family所使用的值、相应的通信域以及相关支持协议。

表1 Family值 AF_UNIX AF_INET AF-NS 通信域 UNIX域 互联网域 xerox域 支持协议 UNIX通信协议 TCP/IP XNS 参数type是Socket的类型,指明了通信两端的进程以何种方式进行通信。目前Socket支持下列的通信方式,如表2所列

表2 Socket类型 type值 sock_STREAM sock_DGRAM sock一SEQPACKET sock_RAM 类型 流式 数据报式 顺序信息报式 原始式 描述 直接访问下层通信协议 可靠顺序的且保持界标的数据传送 无连接通信,数据传送是不可靠的、无序的 面向连接的通信,可进行可靠、顺序的数据传送

2. bind调用:

int bind(sockf d myaddr addrlen) int sockf d;

struct sockaddr,myaddr; int addrlent;

bind一调用把一个名字与Socket描述符联系起来,也就是给一个Socket赋一个名字。UNIX域中进程的地址是按文件的路径名来查找,而互连网域中进程的地址就不同了。使用bind则是为互连网域的本地进程赋予它的地址,并把该地址与进程的Socket描述符相联系起来。

参数sockf d是调用socket o)的返回值,亦即Socket描述符;参数myaddr是名字(UNIX域)或者地址(互连网域)addrlen参数是myaddr的长度。

3.connect()调用:

int connect(sockf d,servaddr,addrlen) int sockf d;

struct sockaddr,servaddr; int addrlen;

在面向连接的通信中,client方进程通过调用connect()来启动一个连接;而非连接的通信中,调用connect()则有不同的含义,此时connect调用是通知UNIX的核心,随

- 18 -

后的调用send所使用的地址,而connect本身不建立连接。

参数sockf d是Socket描述符,而servaddr则是成为通信信道另一个端点上进程的地址;addrlen是地址结构sockaddr的长度。当连接建立成功后,connect的返回值不小于0,否则返回出错信息。

4.listen()调用:

int listen(sockf d,queuelen) int sockf d queuelen;

当server方进程准备在一条通信信息上接受连接时,系统必须将到来的连接请求送入队列,直到进程来为该请求服务。listen调用是指明所能接收的连接请求的最大数目,也就是队列的最大长度queuelen参数指出了待处理请求的最大数目sockfd是描述符。

5.accept()调用:

newsockfd== accept(sockfd clieaddr addrlen); int sockfd newsockfd;

struct sockaddr *clieaddr; int *addrlen;

该调用取队列上的第一个连接请求,并建立一个与描述符sockf d具有相询特性的Socket.若没有连接请求,accept阻塞调用者直到有连接请求的到达。

参数sockf d是Socket描述符clieaddr为向server方进程发出连接请求的client方进程地fk ; addrlen为该地址结构的长度。注意,参数clieaddr和addrlen是accept调用返回时,由系统来填人的。

newsockfd是一个与sockfd描述不同的新的Socket描述符;accept调用认为server是并发server,因而不但建立一个新的Socket,而且还指定与newsockf d相联系的新地址。这样server进程一方面可以在与sockf d'相关的地址上继续倾听(listen);另一方面在另一分开的通信信道上(与newsockf d相关的地址)与client进程进行通信。

6.send()和recv()调用:

count== send(sockfd,msg,length,flag); count== recv(sockfd,buf,length,flag); int count,sockf d; char *msg ,*buf; int length flag;

两个调用在一个已连接的socket上发送和接收数据、。参数sockf d为Socket描述符msg是要发送数据的缓冲区length是它的长度buf则是存放到来数据的数组buf也有一个指出其长度的参数length.

如果没有参数flag,上述两个调用的语法及语义与write和read就没有什么不同了。flag使这两个调用有了一些新特性。flag= 0 Of-;表示正常的数据发送或接收;flag =MSG _ OOB时,表示发送或接收带外数据(一种非常规的紧急数据)flag = MSG- PEEK时,表示在接收端上可以“偷看”一个到来的报文,检查它的内容但并不把它从队列中移去;当flag = MSGDON- ROUTE时,表示可以在没有网络路由选择的情况下发送数据。

count是调用的返回值,它以发送或接收的实际数据长度作为自己的内容。

7.send to ( )和recvf rom()调用:

- 19 -

count=sendto(sockfd,msg,length,toaddr,addrlen);

count== recvf rom(sockfd,buf,length,fromaddr,&.addrlen); int count,sockf d; char *msg ,*buf;

struct sockadd,toaddr,*fromaddr;- int length,addrlen;

两调用常用于非连接通信中的发送和接收数据,其返回值以及前三个参数与send和recv调用的参数和返回值含义一样。

参数toaddr指出了发送到目的地的进程地址addrlen是该地址的长度;参数fromaddr是发送数据的进程的地址,它也使用一个整数addrlen来指出长度。

8.close ( )和shutdown()调用: int close (int sockf d );、·

int shutdown (int sockf d , int mode); close调用关闭一套接字,并释放该Socket的描述符shutdown调用关闭一套接字连接,但该Socket描述符仍旧原封不动。

mode为1,指示不允许发送方发送数据;mode为0,表示不允许接收方接收数据;而mode为2,则表示发送和接受数据皆不允许;参数sockfd是Socket描述符。

附:参考程序(C语言)

# include(sys/Socket.h) # include(netinet/in.h) # include(netdb.h)

server方程序 main() {

int sockfd length;

struct sockaddr_ in name; char buf[1024];

//create Socket from which to read sockfd=Socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) {

perror(\ exit(1); }

//create name with wildcard name.sin_family=AF_INET;

name.sin_addr.s_addr=INADDR_ANY; name.sin_port=0;

- 20 -

if(bind(Sockfd,(struct sockaddr *)&name size of name)<0> {

perror(\ exit(1); }

//find assigned port value length=sizeof(name);

if(getsock name(sockfd(struct sockaddr *)&name &length) <0> {

perror(\ exit(1); }

printf(\ //Read from the Socket

if(read(sockfd,but,1024)<)0)

perror(\ printf(\); close(sockfd); exit(0); }

#include \

#define DATA \ //The form of the command line is //命令 主机 名端口号 ,/ main(argc,argv) int argc; char *argv[]; {

int sockfd;

struct sockaddr_in name;

struct hostnet *hp,*gethostbyname(); //create Socket on which to send

sockfd=Soeket(AF_INET,SOCK_DGRAM,0); if (Sockfd<0) {

perror(\ exit (1); }

hp=gethostbyname(argv[1]); if (hp==0) {

- 21 -

fprintf(stderr,\ exit(2); }

bcopy((char*)hp->h_addr,(char*)&name.sin_addr.hp->h_ length); name.sin_family=AF_INET;

name.sin_port= htons(atoi(argv[2]); /*send message‘/

if( sendto( sockfd,DATA, sizeof( DATA),0,( struct sockaddr *) & name, sized( name))<0) perror(\close( sockfd); exit(0); }

- 22 -

本文来源:https://www.bwwdw.com/article/tezo.html

Top