计算机网络实验报告(路由算法、Socket编程)

合集下载

计算机网络实验报告

计算机网络实验报告

计算机网络实验报告计算机网络实验报告计算机网络实验是大学计算机科学与技术专业的一门重要的实践课程,通过这门课程的学习和实践,学生们可以掌握计算机网络的基本知识,理解网络常见的问题和解决方案,熟练掌握网络配置、测试和故障排除等技能。

在这篇文章中,我们将介绍计算机网络实验报告的要求和相关案例。

一、计算机网络实验报告的要求1. 实验目的和方法在计算机网络实验报告中,首先应清晰地阐述实验的目的和方法,即实验要达到什么样的目标,使用什么样的方法来实现这个目标。

2. 实验环境和工具在实验报告中,要详细描述实验所使用的软硬件环境和工具,包括实验平台、操作系统、网络拓扑结构、网络设备、协议分析工具等,这些信息可以帮助读者更好地理解实验的过程和结果。

3. 实验步骤和过程实验步骤和过程是实验报告的核心内容,应详细描述实验的每一个步骤和过程,包括实验前的准备工作、实验中的操作流程、实验的成功与失败情况等。

4. 实验结果和分析实验结果和分析是实验报告的重要组成部分,应对实验结果进行分析和总结,分析实验中遇到的问题和解决方案,总结实验的收获和不足之处。

5. 实验总结和建议在实验报告的最后,应进行实验总结和建议,总结实验的目的、过程和结果,提出对实验的改进建议和未来拓展的方向。

二、计算机网络实验报告案例1. 实验名称:网络文件传输实验实验目的:学习FTP、HTTP协议,掌握文件传输的基本原理和方法。

实验环境:Windows 7/10,FileZilla等软件。

实验步骤:1)安装FileZilla软件。

2)配置本地站点和FTP服务器,连接FTP服务器。

3)上传和下载文件,记录传输速度和流量。

4)进行HTTP文件下载实验,观察文件下载的过程和数据传输情况。

实验结果和分析:我们成功地完成了FTP和HTTP文件传输实验,对文件传输的原理和方法有了更深入的认识。

同时,我们也发现了文件传输的安全问题,并提出了数据加密的建议,以保护文件传输的安全。

实验07-TCP_IP+Socket编程

实验07-TCP_IP+Socket编程

《计算机网络》实验报告实验序号:07 实验项目名称:TCP_IP Socket编程学号姓名专业、班实验地点实1-514 指导教师实验时间2013-11-26一、实验目的及要求1、通过对路由器安装与配置实验,加深对相关网络设备工作原理理解,掌握其常见产品的安装与配置方法,为将来从事网络工程建设打下基础。

2、通过实验,掌握路由器的基本参数配置、网络接口配置和路由协议配置,掌握静态路由的配置方法。

二、实验设备(环境)及要求计算机;学生不许把食物带到机房吃;不许上网做与实验无关的内容;不许同学之间聊天;保持实验室安静卫生。

下课把键盘,座椅放回原处。

三、实验内容与步骤1.分别编写基于TCP的socket程序服务端和客户端,要求客户端能发送消息到服务端,服务端再把此消息返回给客户端。

服务端:(1)打开vc++6.0,File-》new-》Projects-》Win32 Console Application,输入Project name,例如SimpleTCP_s,选择location后单击OK,选择simple application,单击ok。

(2)打开SimpleTCP_s.cpp,输入如下内容:#include "stdafx.h"#include <stdio.h>#include <winsock2.h> //WINSOCK.H(这个是WINSOCK API的头文件,WIN2K以上支持WINSOCK2,所以//可以用WINSOCK2.H);#pragma comment(lib, "WS2_32.lib")//Ws2_32.lib(WINSOCK API连接库文件).#define BUF_SIZE 1024int main(int argc, char* argv[]){WSADA TA wsaData;SOCKET socketL; // socket for listeningSOCKET socketC; // socket for CommunicationSOCKADDR_IN serverAddr;int nRet = -1;char recvbuf[BUF_SIZE];if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("WSAStartup failed!\n");return 1;}socketL = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(5678);serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(socketL, (SOCKADDR*)&serverAddr, sizeof(serverAddr));listen(socketL, 5);socketC = accept(socketL, NULL, NULL);if (socketC != INV ALID_SOCKET){nRet = recv(socketC, recvbuf, sizeof(recvbuf), 0);if (nRet > 0)printf("%s ", recvbuf);}closesocket(socketC);closesocket(socketL);WSACleanup();printf("请按回车键关闭");getchar();return 0;}(3)编译工程客户端:(1)和服务端一样操作,建立SimpleTCP_c工程。

socket编程实验报告

socket编程实验报告

socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它允许不同的计算机之间进行数据交换和通信。

通过实验,我们可以更深入地了解Socket编程的原理和应用。

实验目的:1. 了解Socket编程的基本原理和概念2. 掌握Socket编程的基本操作和使用方法3. 实现简单的客户端和服务器端通信实验环境:1. 操作系统:Windows或Linux2. 编程语言:C/C++或Python实验步骤:1. 理解Socket编程的基本原理和概念,包括TCP和UDP协议2. 编写客户端程序,建立与服务器端的连接3. 编写服务器端程序,接受客户端的连接并进行数据交换4. 测试客户端和服务器端的通信功能,包括发送和接收数据实验结果:通过实验,我们成功实现了简单的客户端和服务器端通信。

我们能够在客户端发送数据,服务器端接收并处理数据,然后再将处理结果返回给客户端。

这证明了Socket编程的可行性和实用性。

实验总结:Socket编程是一种强大而灵活的通信方式,它可以实现不同计算机之间的数据交换和通信。

通过本次实验,我们更加深入地了解了Socket编程的原理和应用,掌握了基本的操作和使用方法。

我们相信在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

通过这次实验,我们对Socket编程有了更深刻的理解,也提升了我们的编程能力和实践能力。

我们相信,在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

计算机网络实验报告 winsock编程

计算机网络实验报告 winsock编程

计算机网络实验一:socket文件传输一、实验目地1、了解网络通信原理。

掌握客户端/服务器程序设计。

2、理解Socket通信原理,掌握使用ServerSocket类和Socket类进行TCPSocket通信的程序设计方法二、实验原理Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。

此后,应用程序送给Socket的数据,由Socket交网络驱动程序向网络上发送出去。

计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。

详细如图:我们来分析一下图,Host A上的程序A将一段信息写入Socket中,Socket 的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B 的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。

Socket套接口有3种类型。

1.SOCK_STREAM流式套接口,面向连接的,可靠地,TCP。

2.SOCK_DRAM数据报套接口,面向无连接,不可靠,UDP。

3.原始套接口,主要用于新的网络协议实现的测试三、实验分析1、实验要求、按需求编写服务器端和客户端程序代码。

实现:(1)服务器端向客户端提供文件目录。

(2)客户端向服务器端发出请求下载文件。

(3)客户端向服务器端上传文件。

2、Socket通信工作过程如下(1)、建立连接服务器(ServerSocket)监听指定端口,看是否有客户端的连接请求;客户端(ClientServer)创建套接字并通过指定端口请求与服务器建立连接。

计算机网络实验报告

计算机网络实验报告

西南大学信息管理系《计算机网络》课程实验报告学生姓名:学号:专业班级:指导教师:二0一二年12 月 3 日一、实验题目socket编程二、实验目的熟悉掌握socket编程命令。

三、实验内容1、程序的设计、调试、运行的软件环境(1)Win7(2)Visual Studio2010旗舰版。

2、程序窗体设计(1)客户端程序窗体设计,如图3.2.1所示:图3.2.1 (2)服务端程序窗体设计如图3.2.2所示:图3.2.2 3、程序主要代码(1)客户端主要程序代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using .Sockets;using ;using System.IO;using System.Threading;namespace SyncChatClient{public partial class MainForm : Form{private string ServerIP;private int port;private bool isExit = false;private TcpClient client;private BinaryReader br;private BinaryWriter bw;public MainForm(){InitializeComponent();Random r = new Random((int)DateTime.Now.Ticks);txt_UserName.Text = "user" + r.Next(100, 999);lst_OnlineUser.HorizontalScrollbar = true;SetServerIPAndPort();}private void SetServerIPAndPort(){try{FileStream fs = new FileStream("ServerIPAndPort.txt", FileMode.Open);StreamReader sr = new StreamReader(fs);string IPAndPort = sr.ReadLine();ServerIP = IPAndPort.Split(':')[0];port = int.Parse(IPAndPort.Split(':')[1]);sr.Close();fs.Close();}catch (Exception ex){MessageBox.Show("配置IP与端口失败,错误的原因:" + ex.Message);Application.Exit();}}private void btn_Login_Click(object sender, EventArgs e){btn_Login.Enabled = fal se;try{client = new TcpClient();client.Connect(IPAddress.Parse(ServerIP), port);AddTalkMessage("连接成功");}catch(Exception ex){AddTalkMessage("连接失败的原因" + ex.Message);btn_Login.Enabled = true;return;}NetworkStream networkStream = client.GetStream();br = new BinaryReader(networkStream);bw = new BinaryWriter(networkStream);SendMessage("Logi n," + txt_UserName.Text);Thread threadReceive = new Thread(new ThreadStart(ReceiveData));threadReceive.IsBackground = true;threadReceive.Start();}private void ReceiveData(){string receiveString = null;while (isExit == false){try{receiveString = br.ReadString();}catch{if (isExit == false){MessageBox.Show("与服务器失去连接");}break;}string[] splitString = receiveString.Split(',');string command = splitString[0].ToLower();switch (command){case"login":AddOnline(splitString[1]);break;case"logout":RemoveUserName(splitString[1]);break;case"talk":AddTalkMessage(splitString[1] + ":\r\n");AddTalkMessage(receiveString.Substring(splitString[0].Length + splitString[1].Length+2));break;default:AddTalkMessage("什么意思啊?:" + receiveString);break;}}Application.Exit();}private void SendMessage(string message){try{bw.Write(message);bw.Flush();}catch{AddTalkMessage("发送失败");}}private delegate void AddTalkMessageDelegate(string message);private void AddTalkMessage(string message){if (txt_Message.InvokeRequired){AddTalkMessageDelegate d = new AddTalkMessageDelegate(AddTalkMessage);txt_Message.Invoke(d, new object[] { message });}else{txt_Message.AppendText(message + Environment.NewLine);txt_Message.ScrollToCaret();}}private delegate void AddOnlineDelegate(string message);private void AddOnline(string userName){if (lst_OnlineUser.InvokeRequired){AddOnlineDelegate d = new AddOnlineDelegate(AddOnline);lst_OnlineUser.Invoke(d, new object[] { userName });}else{lst_OnlineUser.Item s.Add(userName);lst_OnlineUser.SelectedIndex = lst_OnlineUser.Items.Count - 1;lst_OnlineUser.ClearSelected();}}private delegate void RemoveUserNameDelegate(string userName);private void RemoveUserName(string userName){if (lst_OnlineUser.InvokeRequired){RemoveUserNameDelegate d = new RemoveUserNameDelegate(RemoveUserName);lst_OnlineUser.Invoke(d, userName);}else{lst_OnlineUser.Item s.Remove(userName);lst_OnlineUser.SelectedIndex = lst_OnlineUser.Items.Count - 1;lst_OnlineUser.ClearSelected();}}private void btn_Send_Click(object sender, EventArgs e){if (lst_OnlineUser.SelectedIndex != -1){SendMessage("Talk," + lst_OnlineUser.SelectedItem + "," + txt_SendText.Text + "\r\n");txt_SendText.Clear();}else{MessageBox.Show("请先¨在¨【当前在线】中选择一个对话着");}}private void Mai nForm_FormClosing(object sender, FormClosingEventArgs e){if (client != null){try{SendMessage("Logout," + txt_UserName.Text);isExit = true;br.Close();bw.Close();client.Close();}catch{}}}private void txt_SendText_KeyPress(object sender, KeyPressEventArgs e){if (e.KeyChar == (char)Keys.Return){btn_Send.PerformClick();}}private void btn_LoadOnlineUser_Click(object sender, EventArgs e){}private void Mai nForm_Load(object sender, EventArgs e){}}}(2)服务端程序主要代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using ;using .Sockets;using System.Threading;using System.IO;namespace SyncChatServer{public partial class MainForm : Form{private List<User> userList = new List<User>();private string ServerIP;private int port;private TcpListener myListener;bool isNormalExit = false;public MainForm(){InitializeComponent();lst_State.HorizontalScrollbar = true;btn_Stop.Enabled = false;SetServerIPAndPort();}private void SetServerIPAndPort(){FileStream fs = new FileStream("ServerIPAndPort.txt", FileMode.Open);StreamReader sr = new StreamReader(fs);string IPAndPort = sr.ReadLine();ServerIP = IPAndPort.Split(':')[0];port = int.Parse(IPAndPort.Split(':')[1]);sr.Close();fs.Close();}private void btn_Start_Click(object sender, EventArgs e){myListener = new TcpListener(IPAddress.Parse(ServerIP), port);myListener.Start();AddItemToListBox(string.Format("开a始º?在¨²{0}:{1}监¨¤听¬y客¨ª户¡ì连¢?接¨®", ServerIP, port));Thread myThread = new Thread(ListenClientC onnect);myThread.Start();btn_Start.Enabled = false;btn_Stop.Enabled = true;}private void ListenClientConnect(){TcpClient newClient = null;while (true){try{newClient = myListener.AcceptTcpClient();}catch{break;}User user = new User(newClient);Thread threadReceive = new Thread(ReceiveData);threadReceive.Start(user);userList.Add(user);AddItemToListBox(string.Format("[{0}]进入", newClient.Client.RemoteEndPoint));AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count));}}private void ReceiveData(object userState){User user = (User)userState;TcpClient client = user.client;while (isNormalExit == false){string recei veString = null;try{receiveString = user.br.ReadString();}catch (Exception){if (isNormalExit == false){AddItemToListBox(string.Format("与[{0}]失去联系,已终止接收该用户信息", client.Client.RemoteEndPoint));RemoveUser(user);}break;}AddItemToListBox(string.Format("来自[{0}]:{1}",user.client.Client.RemoteEndPoint,receiveString));string[] splitString = receiveString.Split(',');switch(splitString[0]){case"Login":erName = splitString[1];SendToAllClient(user,receiveString);break;case"Logout":SendToAllClient(user,receiveString);RemoveUser(user);return;case"Talk":string talkString = receiveString.Substring(splitString[0].Length + splitString[1].Length + 2);AddItemToListBox(string.Format("{0}对{1}说{2}",erName,splitString[1],talkString));SendToClient(user,"talk," + erName + "," + talkString);foreach(User target in userList){if(erName == splitString[1] && erName != splitString[1]){SendToClient(target,"talk," + erName + "," + talkString);break;}}break;default:AddItemToListBox("什么意思啊:" + receiveString);break;}}}private void SendToAllClient(User user, string message){string command = message.Split(',')[0].ToLower();if (command == "login"){for (int i = 0; i < userList.Count; i++){SendToClient(user, "login," + userList[i].userName);}for (int i = 0; i < userList.Count; i++){if (erName != userList[i].userName){SendToClient(userList[i], "login," + erName);}}}else if(command == "logout"){for (int i = 0; i < userList.Count; i++){if (userList[i].userName != erName){SendToClient(userList[i], message);}}}}private void SendToClient(User user, string message){try{user.bw.Write(message);user.bw.Flush();AddItemToListBox(string.Format("向[{0}]发送:{1}", erName, message));}catch{AddItemToListBox(string.Format("向[{0}]发送信息失败",erName));}}private void RemoveUser(User user){userList.Remove(user);user.Close();AddItemToListBox(string.Format("当前连接用户数:{0}",userList.Count));}private delegate void AddItemToListBoxDelegate(string str);private void AddItemToListB ox(string str){if (lst_State.InvokeRequired){AddItemToListBoxDelegate d = AddItemToListBox;lst_State.Invoke(d, str);}else{lst_State.Item s.Add(str);lst_State.SelectedIndex = lst_State.Item s.Count - 1;lst_State.ClearSelected();}}private void btn_Stop_Click(object sender, EventArgs e){AddItemToListBox("开始停止服务,并依次使用户退出!");isNormalExit = true;for (int i = userList.Count - 1; i >= 0; i--){RemoveUser(userList[i]);}myListener.Stop();btn_Start.Enabled = true;btn_Stop.Enabled = false;}private void Mai nForm_FormClosing(object sender, FormClosingEventArgs e){if (myListener != null)btn_Stop.PerformClick();}private void Mai nForm_Load(object sender, EventArgs e){}}}4、运行程序先后打开服务端和客户端程序,然后点击服务端“开始监听”按钮,服务端信息框里就会显示“开始监听客户端”;然后在客户端“用户名”里创建一个用户名,否则系统默认自动生成用户名,用户名创建成功后点击“登录”按钮,客户端显示登录成功,服务端现实用户进入,接下来只需选中需要对话的人,就可开始对话。

计算机网络实验报告(路由算法、Socket编程)

计算机网络实验报告(路由算法、Socket编程)

计算机网络实验报告班级:姓名:学号:实验一一.实验目的及要求编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。

二.实验原理距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。

通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。

举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。

假设一个路由器接收到来自邻居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 7typedef 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,press any key to come back.\n");getch();return;}elseInitRoutData(pfile);fclose(pfile);printf("\nthe original route table:\n");for (i = 0; i<VERNUM; i++){printf("%c||", i + 65);for (j = 0; j < VERNUM; j++)if (data[i][j].dis > 0)printf("<%c %d> ", j + 65, data[i][j].dis);printf("\n");}PrintRoutData();getch();for (i = 0; i < VERNUM; i++){for (m = 0; m < VERNUM; m++)for (n = 0; n < VERNUM; 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 < 7; m++){for (n = 0; !feof(pfile) && n < 7; 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 <= '9') || 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 < VERNUM; 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< VERNUM; j++){for (i = 0; i < VERNUM; i++){if (data[i][j].dis <= 0&&i!=j){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);}elseif(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 < VERNUM; i++){if (data[send][i].dis > 0&& data[send][i].flag!=1) { if (data[recv][i].dis <= 0&&recv!=i) {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 < VERNUM; i++){for (j = 0; j < VERNUM; 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编程实验报告

计算机网络socket编程实验报告

Socket编程实验报告一、程序代码(1)服务器端#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")void main(){ WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) { return; }if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ){ WSACleanup( );return; }SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口listen(sockSrv,SOMAXCONN); //SOMAXCONN由系统确定请求数SOCKADDR_IN addrClient;// 连接上的客户端ip地址int len=sizeof(SOCKADDR);while(1){SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);// 接受客户端连接,获取客户端的ip地址char sendBuf[50];sprintf(sendBuf,"Welcome %s tohere!",inet_ntoa(addrClient.sin_addr));// 组合消息发送出去send(sockConn,sendBuf,strlen(sendBuf)+1,0);// 发送消息到客户端char recvBuf[50]; recv(sockConn,recvBuf,50,0);// 接受客户端消息printf("%s\n",recvBuf);closesocket(sockConn);WSACleanup();//断开连接}}(2)客户端代码#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")void main(){WORD wVersionRequested;WSADATA wsaData;//WSAata用来存储系统传回的关于WinSocket的资料。

Socket编程实验报告

Socket编程实验报告

实验报告实验一Socket编程一、实验目的通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。

二、实验内容①学习socket编程使用的类和接口,着重掌握基于TCP协议的socket。

②编写服务器端的应用程序③编写客户端的应用程序④实现服务器端与客户端的交互三、实验代码1.服务器端程序过程:在端口5000上创建一个等待连接的ServerSocket对象server:server=new ServerSocket(5000);接着调用server对象的accept()方法等待某客户程序发出连接请求。

该方法一直阻塞直到有客户连接到带端口。

一旦有客户发送正确请求,则连接成功,accept()方法返回一个Socket对象,于是得到了一个新的用于通信的Socket对象,通信链路建立成功。

然后利用Socket 类提供的方法创建Socket对象的输入流和输出流。

此后即于客户端进行通信,直到客户端断开连接即关闭各个流结束通信。

代码如下:import .*;import java.io.*;class aa{static public void main (String args[]) throws IOException{ServerSocket server=null;Socket socket=null;InputStream is=null;OutputStream os=null;DataInputStream in=null;PrintStream out=null;try{ //在端口5000注册服务server=new ServerSocket(5000);socket =server.accept();//侦听连接请求,等待连接System.out.println("**********************服务器端界面*************************");System.out.println("与客户端连接成功!");System.out.println("");System.out.println("对话内容为:");System.out.println("");System.out.println("等待客户发送信息.....");//获取对应的Socket的输入/输出流is=socket.getInputStream();os=socket.getOutputStream();//建立数据流in= new DataInputStream(is);out =new PrintStream(os);//表示向对方输出out.println("Welcome!");//表示向对方输出String str=in.readLine();//逐行读取do{System.out.println("客户端说:"+ str);str=in.readLine();}while(str.trim().equals("BYE")) //如果是“BYE”就退出System.out.println("客户想要离开");}catch(Exception e) //捕获程序异常{System.out.println("Error:"+e);}finally{is.close();//关闭输入流os.close();//关闭输出流in.close();//关闭数据输入流socket.close();//关闭socket}}}2.客户端程序过程:首先创建一个指向服务器的指定端口号(5000)的Socket对象socket:socket=new Socket("localhost",5000);此时服务器指定为本地计算机,若要在网络中指定服务器,只需要将参数localhost改成相应的服务器名或者IP地址即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机网络实验报告班级:姓名:学号:实验一一.实验目的及要求编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。

二.实验原理距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。

通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。

举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。

假设一个路由器接收到来自邻居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 7typedef 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,press any key to come back.\n");getch();return;}elseInitRoutData(pfile);fclose(pfile);printf("\nthe original route table:\n");for (i = 0; i<VERNUM; i++){printf("%c||", i + 65);for (j = 0; j < VERNUM; j++)if (data[i][j].dis > 0)printf("<%c %d> ", j + 65, data[i][j].dis);printf("\n");}PrintRoutData();getch();for (i = 0; i < VERNUM; i++){for (m = 0; m < VERNUM; m++)for (n = 0; n < VERNUM; 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 < 7; m++){for (n = 0; !feof(pfile) && n < 7; 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 <= '9') || 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 < VERNUM; 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< VERNUM; j++){for (i = 0; i < VERNUM; i++){if (data[i][j].dis <= 0&&i!=j){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);}elseif(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 < VERNUM; i++){if (data[send][i].dis > 0&& data[send][i].flag!=1) { if (data[recv][i].dis <= 0&&recv!=i) {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 < VERNUM; i++){for (j = 0; j < VERNUM; 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文件流的知识,实现两端的信息传递。

相关文档
最新文档