计算机网络实验报告
班级: 姓名: 学号:
实验一
一. 实验目的及要求
编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。
二. 实验原理
距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。
举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。假设一个路由器接收到来自邻居x的一个列表,其中x(i)表示x估计的到达路由器i所需要的时间。如果该路由器知道他到x的延时为m毫秒,那么他也知道在x(i)+m毫秒之间内经过x可以到达路由器i。一个路由器针对每个邻居都执行这样的计算,就可以发现最佳的估计值,然后在新的路由器表中使用这个最佳的估计值以及对应的输出路线。
三.源程序:
#include \"stdio.h\" #include \"stdlib.h\" #include \"malloc.h\" #include \"graphics.h\" #include \"dos.h\" #define VERNUM 7
typedef struct {
int dis;
int flag;
int flag2; }RoutNode;
char tmp[10]; RoutNode data[VERNUM][VERNUM];
void welcome();
void InitRoutData(FILE* pfile);
void PrintRoutData();
void SendInf(int recv, int send);
void Exchange();
int main() {
int start, end, i, j, m, n;
FILE *pfile;
welcome();
pfile = fopen(\"1.txt\", \"r\");
if (pfile == NULL)
{
printf(\"the file wrong,pre any key to come back.\\n\");
getch();
return;
}
else
InitRoutData(pfile);
fclose(pfile);
printf(\"\\nthe original route table:\\n\");
for (i = 0; i
{
printf(\"%c||\", i + 65);
for (j = 0; j
if (data[i][j].dis > 0)
printf(\"<%c %d> \", j + 65, data[i][j].dis);
printf(\"\\n\");
}
PrintRoutData();
getch();
for (i = 0; i
{
for (m = 0; m
for (n = 0; n
data[m][n].flag = 0;
Exchange();
PrintRoutData();
getch();
}
printf(\"\\nexchange the route table:\\n\");
return 0; }
void welcome() {
int gdriver=DETECT,gmode;
registerbgidriver(EGAVGA_driver);
initgraph( &gdriver, &gmode,\"C:\\Win-TC\");
cleardevice();
setbkcolor(CYAN);
setviewport(0,0,639,479,1);
clearviewport();
setbkcolor(BLUE);
setcolor(14);
rectangle(200,200,440,280);
setfillstyle(1,5);
floodfill(300,240,14);
settextstyle(0,0,2);
outtextxy(50,30,\"Distance Vector Routing Algorithm\");
setcolor(15);
settextstyle(1,0,4);
outtextxy(260,214,\"Welcome to use!\");
line(0,80,640,80);
getch();
delay(300);
cleardevice(); } void InitRoutData(FILE* pfile) {
char num[10];
int i = 0;
char c;
int m, n;
fseek(pfile, 0, 0);
for (m = 0; !feof(pfile) && m
{
for (n = 0; !feof(pfile) && n
{
while (!feof(pfile))
{
c = fgetc(pfile);
if (c == \',\')
{
num[i] = \'\\0\';
data[m][n].dis = atoi(num);
data[m][n].flag = 0;
data[m][n].flag = 0;
i = 0;
break;
} /*end of if*/
else if ((c >= \'0\' && c
{
num[i++] = c;
} /*end of else if*/
} /*end of while*/
} /*end of for (n = 0*/
} /*end of for (m = 0*/ }
void PrintRoutData() {
int i, j;
for (i = 0; i
{
settextstyle(1,0,3);
sprintf(tmp,\" %c\",i + 65);
outtextxy(i*80+50,130,tmp);
outtextxy(10,160+i*40,tmp);
}
for (j = 0; j
{
for (i = 0; i
{
if (data[i][j].dis
{
if(data[i][j].flag2 ==1)
{
setfillstyle(SOLID_FILL,5);
bar(80*i+50,40*j+155,80*i+120,40*j+185);
delay(50000);
data[i][j].flag2 =0;
}
setfillstyle(SOLID_FILL,3);
bar(80*i+50,40*j+155,80*i+120,40*j+185);
settextstyle(1,0,2);
sprintf(tmp,\"-\");
outtextxy(80*i+65,40*j+165,tmp);
}
else
if(data[i][j].dis >=0)
{
if(data[i][j].flag2 ==1)
{
setfillstyle(SOLID_FILL,5);
bar(80*i+50,40*j+155,80*i+120,40*j+185);
delay(50000);
data[i][j].flag2 =0;
}
setfillstyle(SOLID_FILL,3);
bar(80*i+50,40*j+155,80*i+120,40*j+185);
settextstyle(1,0,2);
sprintf(tmp,\"%d\",data[i][j].dis);
outtextxy(80*i+65,40*j+165,tmp);
}
} /*end of for (j = 0*/
} /*end of for (i = 0*/ }
void SendInf(int recv, int send) {
int i;
for (i = 0; i
{
if (data[send][i].dis > 0&& data[send][i].flag!=1)
{
if (data[recv][i].dis
{
data[recv][i].dis = data[send][i].dis + data[recv][send].dis;
data[recv][i].flag =1;
data[recv][i].flag2 =1;
}
else if (data[recv][i].dis > data[send][i].dis + data[recv][send].dis)
{
data[recv][i].dis = data[send][i].dis + data[recv][send].dis;
data[recv][i].flag =1;
data[recv][i].flag2 =1;
}
} /*end of if*/
} /*end of for*/ }
void Exchange() {
int i, j;
for (i = 0; i
{
for (j = 0; j
{
if (data[i][j].dis > 0&& data[i][j].flag!=1)
{
SendInf(i, j);
} /*end of if*/
} /*end of for (j = 0*/
} /*end of for (i = 0*/ }
四、实验心得体会
通过本次实验训练,我了解了距离矢量路由算法的基本原理,复习了C语言编程的内容,通过对路由算法的实现,加深了对路由表交换的理解。
实验二
一、实验目的及要求
编写程序,联系Socket编程和TCP/IP协议的应用,要求实现Server端和Client端的信息通信。
二、实验原理
在TCP/IP编程中,为客户端和服务器端提供相同的端口号和IP地址号,实现Server端和Client端互联,运用Java文件流的知识,实现两端的信息传递。
三、源程序
/********************ChatClient*********************/ import java.awt.*; import java.awt.event.*; import java.io.*; import java.io.IOException; import java.net.*;
public cla ChatClient extends Frame{
Socket s = null; DataOutputStream dos = null; TextField tf = new TextField(); TextArea ta = new TextArea();
public static void main(String[] args) { new ChatClient().launchFrame(); }
public void launchFrame() { setLocation(400,300); this.setSize(300,300); add(tf,BorderLayout.SOUTH); add(ta,BorderLayout.NORTH); pack(); tf.addActionListener(new tfListener()); this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
disconn();
System.exit(0);
} }); setVisible(true); conn(); }
public void conn () { try {
s = new Socket(\"127.0.0.1\",5555);
dos = new DataOutputStream(s.getOutputStream());
System.out.println(\"客户端连接成功!\"); } catch (UnknownHostException e) {
e.printStackTrace(); } catch (IOException e) {
e.printStackTrace(); } }
public void disconn() { try {
dos.close();
s.close(); } catch (IOException e) {
e.printStackTrace(); } }
private cla tfListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String str = tf.getText().trim();
ta.setText(str);
tf.setText(\"\");
try {
dos.writeUTF(str);
dos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
} }
/********************ChatServer******************/ import java.io.IOException; import java.net.*; import java.io.*;
public cla ChatServer {
public static void main(String[] args) {
boolean started = false;
try {
ServerSocket = new ServerSocket(5555);
started = true;
while(started) {
boolean bConn = false;
Socket s = .accept();
bConn = true;
System.out.println(\"一个客户端已连接\");
DataInputStream dis = new DataInputStream(s.getInputStream());
while(bConn){
String str = dis.readUTF();
System.out.println(str);
}
}
}
dis.close(); } } catch (IOException e) { e.printStackTrace(); }
四、实验心得体会 通过本次实验的练习,熟悉了TCP/IP协议,对套接字等概念有了深入的了解,对用Java语言实现Socket编程并实现客户端和服务器端的信息交互有了一定的了解。