您的当前位置:首页正文

计算机通信与网络实验讲义

2020-11-06 来源:年旅网


《计算机通讯与网络》

实验讲义

重庆大学 自动化学院

2014年6月

目 录

目 录

实验一:常用网络命令的使用与RJ45接口连线制作 ................... 1 实验二:使用宽带路由器和集线器构建局域网 .............................. 7 实验三:路由器仿真软件实验 ........................................................ 17 实验四:CRC校验码生成 ............................................................... 20 实验五:点对点网络通信编程 ........................................................ 25

- I -

实验一:常用网络命令的使用与RJ45接口连线制作

一、实验名称

常用网络命令的使用与RJ45接口连线制作 二、实验目的

学会常用网络命令的使用,掌握直通线、交叉线的制作方法 三、实验内容与要求

1.使用常用的网络命令,能够理解命令显示内容,具有通过基本的网络命令分析网络故障的能力

2.制作直连网线和交叉线,掌握网线制作方法 四、实验设备

1.微机 2.网卡 3.RJ45头 4.压线钳 5.未制作网线 6.网络测试仪 五、预习内容

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

3.Windows下常用网络命令 六、实验步骤

(一)学习使用常用网络命令,观察显示结果,并进行分析

1.首先需要打开DOS命令界面,通过点击开始菜单中的“运行”选项,输入“cmd”, 回车即可打开。

2.在DOS命令界面键入:ping /?(或ping)回车,出现如图1所示的帮助界面。 3.使用ping命令完成以下功能:

①判定网络故障,应用格式为:ping IP地址 ping 本机IP:检查网卡安装配置是否有问题

如果在MS-DOS方式下执行此命令显示内容为:Request timed out,则表明网卡安装或配置有问题。将网线断开再次执行此命令,如果显示正常,则说明本机使用的IP地址可能与另一台正在使用的机器IP地址重复了。如果仍然不正常,则表明本机网卡安装或配置有问题,需继续检查相关网络配置。如果出现如图2所示结果,说明网卡安装配置没有问题。

ping 网关IP:检查网关路由器是否正常运行

ping 远程IP:检测本机能否正常访问Internet(百度IP:119.75.217.56)

- 1 -

图1 ping命令帮助界面

图2 ping本机IP运行正常结果

②ping命令选项中的常用参数,应用格式为:ping IP地址或主机名 [-t] [-a] [-n count] [-l size]

参数含义:

-t不停地向目标主机发送数据;

-a 以IP地址格式来显示目标主机的网络地址;

-n count 指定要Ping多少次,具体次数由count来指定; -l size 指定发送到目标主机的数据包的大小。

例如:ping 202.202.0.33 –t 实现向目标地址202.202.0.33不断发送数据并接收 ping 202.202.0.33 –n 5 实现向目标地址202.202.0.33发送并接收数据5次

- 2 -

ping 202.202.0.33 –l 65500 –t 实现不断向目标地址202.202.0.33发送并接收大

小为65500字节的数据

ping 202.202.0.33 –l 64 –n 5 实现向目标地址202.202.0.33发送并接受5次大小

为64字节的数据 ③查看dns、ip、mac等

a.在DOS命令界面键入Ipconfig,查看本机IP地址

b.在DOS命令界面键入Ipconfig –all(或Ipconfig /all),查看DNS服务器和MAC地址(物理地址)

c.Nslookup可实现域名查询功能

④netstat –a:显示出你的计算机当前所开放的所有端口

显示活动的 tcp 连接、计算机侦听的端口、以太网统计信息、ip 路由表、ipv4 统计信息(对于 ip、icmp、tcp 和 udp 协议)以及 ipv6 统计信息(对于 ipv6、icmpv6、通过 ipv6 的 tcp 以及通过 ipv6 的 udp 协议)。使用时如果不带参数,netstat 显示活动的 tcp 连接。 netstat -s -e 比较详细的显示你的网络资料,包括tcp、udp、icmp 和 ip的统计等

- 3 -

⑤arp –a:探测arp绑定(动态和静态)列表,显示所有连接了我的计算机,显示对方ip和mac地址

⑥在网络邻居上隐藏你的计算机 net config server /hidden:yes

net config server /hidden:no 则为开启 ⑦路由跟踪命令 tracert pop.pcpop.com

pathping pop.pcpop.com 除了显示路由外,还提供325s的分析,计算丢失包的%

- 4 -

(二)RJ45接口线制作

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

4.分别对所连的两块网卡进行设置 5.用Ping 命令Ping对方IP测试连通性

附录一:有关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接头时,可以紧握双绞线的外皮,再捏住尼龙线往外皮的下方剥开,就可以得到较长的裸露线。

- 5 -

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

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

步骤4:把第二对线分开,第三对线包中间,第三对线的深色线与浅色线对调(反线与正线的排列顺序不一样),(制作反线时线的排列顺序与正线不一样,制作正线时,两端都直接采用同一标准,A标准或B标准。当制作反线时,一端使用A标准,则另一端必须使用B标准) 常见的错误接法是将绿色线放到第4只脚的位置。应该将绿色线放在第6只脚的位置才是正确的,因为在100BaseT网络中,第3只脚与第6只脚是同一对的,所以需要使用同一对残。

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

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

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

- 6 -

实验二 使用宽带路由器和集线器构建局域网

一、实验名称:使用宽带路由器和集线器构建局域网

二、实验目的:学会宽带路由器的配置方法,掌握使用宽带路由器和集线器构建局域网的方法。

三、实验内容

某学校实验室有12台计算机,一个路由器,一个集线器,要将其建成一个局域网并通过校园网接入Internet。实验室拥有1个校内IP:172.20.35.47 ,掩码是255.255.0.0,网关是172.20.35.1.

1.设计组网方案,画出局域网拓扑图。 2.进行局域网配置。 四、实验设备

微机、宽带路由器、集线器 五、预习内容

1.了解宽带路由器、集线器等网络设备的基本知识; 2.组建简单以太网的基本知识; 六、实验步骤 (一)设计拓扑结构图

1.需求分析; 2.总体方案设计; 3.拓扑结构设计。 (二)进行局域网配置

1.设计连接;

2.宽带路由器及相关设备配置。 七、实验说明

网关:网关(Gateway)就是一个网络连接到另一个网络的“关口”。在这里我们所讲的“网关”均指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地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。

- 7 -

用D-Link 宽带路由器构建局域网

以D-Link公司的DI-504路由器为例

第一步:连接DI-504宽带路由器到您的网络

A.首先,将DI-504自带的9V交流电源适配器连接到DI-504后面板上;然后将适配器插入您的电源插座。DI-504前面板的电源LED指示灯亮,表明操作正确。

B.将一条以太网缆线的一端插入DI-504后面板上的WAN端口,另一端插入您的DSL/Cable modem上的以太网端口。DI-504前面板的WAN口的LED指示灯亮,表明操作正确。

C.将另一条以太网缆线的一端插入DI-504后面板上的LAN端口,另一端插入您用于配置DI-504的计算机网卡上。DI-504前面板的LAN口的LED指示灯亮,表明操作正确。

- 8 -

注意:

要复位系统设置为工厂设置,请遵照以下步骤: 1.不要断开DI-504宽带路由器的电源, 2.用曲别针按下reset 按钮并保持5 秒钟,

3.放开按钮DI-504 将自动重启。(备注: 若按住少于五秒钟, DI-504 仅会重新激活, 而不能恢复设置为工厂设置)

第二步:连接其他计算机到DI-504宽带路由器

用其他的以太网缆线,将需要通过DI-504宽带路由器上网的具有以太网接口的其他计算机连接到DI-504后面板上剩余的3个LAN端口上。

当您完成以上两步安装向导后,您所连接的网络拓扑图应与下图相似。

第三步:正确配置您计算机的网络设置

A.在您正在使用的计算机桌面上,用鼠标右键点击网上邻居,选择“属性”。

- 9 -

B.在随后打开的窗口里,用鼠标右键点击网上邻居,选择“属性”。

C.在随后打开的窗口里,先选择Internet协议(TCP/IP),再用鼠标点击“属性”。

D.在随后打开的窗口里,输入IP地址:192.168.0.2;子网掩码:255.255.255.0;默认网关:192.168.0.1;DNS为当地电信的IP地址,以成都为例输入:61.139.2.69。

- 10 -

注:

子网掩码:划分子网的出现是为了克服早起IP地址设计的不合理性,即①IP地址空间的利用率有时很低。 ②给每一个物理网络分配一个网络号会使路由表变得很大。 ③两级的IP地址不够灵活。但是划分子网后,从一个IP数据包的首部无法判断源主机或目的主机所连接的网络是否进行了子网的划分,因为32位的IP地址并不携带任何包含有关子网划分的信息。因此,必须使用子网掩码。子网掩码就是将对应于IP地址中的网络号和子网号的位全部置1,而将对应于IP地址中主机号的位全部置0.

DNS服务器:DNS(域名解析系统),用于将主机名字解析成相应的机器能识别的二进制IP地址的服务器,一般每一个因特网服务提供商就有一个自己的DNS服务器,称为本地域名服务器。该服务器离用户较近,一般不超过几个路由器的距离。

- 11 -

E.然后在开始菜单的运行框里输入ping 192.168.0.1 -t

能得到如下图的结果,就说明您以上的配置正确。

第四步:正确配置DI-504宽带路由器

A.打开Web浏览器,在地址栏中键入http://192.168.0.1,然后按Enter键。

B.在随后打开的登陆窗口里,默认用户名和密码:admin;然后单击“确定”。

- 12 -

C.在随后打开的窗口里,单击“设置向导”。

D.选择“下一步”。

E.设置您的新密码。

- 13 -

F.选择时区。

第五步:DI-504宽带路由器选择互联网连接类型

A.如果您选择动态IP地址,则按以下步骤完成。

- 14 -

按下一步,

点击“重新激活”,完成DI-504宽带路由器的设置。

B.如果您的ISP给您一个固定的IP地址,您就选“固定IP地址”。

输入IPS给您的IP地址,子网掩码,默认网关,DNS后按“下一步”。再点击“重新激活”,完成DI-504宽带路由器的设置。

C.如果您是使用ADSL modem上网,则选择“PPPOE”。

- 15 -

输入由您的ISP提供的用户名和密码;单击下一步后;再点击“重新激活”,完成DI-504宽带路由器的设置。

最后其他设置或信息参看“进阶设定”,“工具”,“系统状态”或DI-504宽带路由器的用户手册。

- 16 -

实验三 路由器设置模拟

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

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

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

- 17 -

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 5.端口初始设置:

查看端口名:switch#show interface

- 18 -

特权模式进入全局配置模式: 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 七、实验要求

1. 要求各网络设备的ip如下: routerA routerB routerC E0 192.168.1.1 Switch 1900 202.202.10.2 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 S0 168.172.10.2 2. 实验网络拓扑结构图如图所示(与软件中的网络结构图相同)

- 19 -

实验四: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可以用下列多项式表示:

C(x)Cn1xn1Cn2xn2C1xC0该多项式称为码多项式。

对于CRC码(n,k),信息码对应一个(k-1)次多项式K(x),校验码对应一个(r一1)次多项式R(x),则C(x)由下式构成:

C(x)xrK(x)R(x)其中,

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

- 20 -

附:参考程序(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;iif(it=*(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)

- 21 -

*(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;it=*(source+i); *(result+i)=t; }

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

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

- 22 -

char t; int i;

for (i=0;it=*(source+i+sublength); *(source+i)=t; }

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

main() {

char *CodeSource=\"1011001\"; char *CodeCRC=\"11001\";

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);

- 23 -

}

}

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

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

for(i=0;iif(it=*(CodeSource+i); *(Result+i)=t; } else {

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

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

- 24 -

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

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

二、实验目的:通过编程,实现点对点网络通信,以巩固对基于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所做的工作是不对称的。在使用基于Socket的系统调用实现进程通信的主要有两类:一类是面向连接的进程通

- 25 -

信,另一类是非连接的进程通信,且注意到两者使用的系统调用有所不同。

常用的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的核心,随后的调用send所使用的地址,而connect本身不建立连接。

- 26 -

参数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()调用:

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

- 27 -

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(\"opering datagram Socket\"); exit(1); }

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

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

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

- 28 -

{

perror(\"binding datagrom Socket\"); exit(1); }

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

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

perror(\"getting Socket name\"); exit(1); }

printf(\"Socket port#%d\\,ntohs(name.sin_port)); //Read from the Socket

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

perror(\"receiving datagram packet\"); printf(\"->%s\\n\); close(sockfd); exit(0); }

#include \"common.h\"

#define DATA \"The sea is calm;the tide is Full\" //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(\"opening datagrom Socket\"); exit (1); }

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

fprintf(stderr,\"%s:unknown host\

- 29 -

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(\"sending datagram message\"); close( sockfd); exit(0); } - 30 -

因篇幅问题不能全部显示,请点此查看更多更全内容