计算机网络 Socket编程实验报告 华中科技大学 HUST
- 格式:doc
- 大小:156.50 KB
- 文档页数:4
课程实验报告课程名称:专业班级:计算机科学与技术1003班学号:姓名:鲁辰指导教师:报告日期:计算机科学与技术学院目录1实验二 Socket 编程(E-Mail)................... 错误!未定义书签。
实验目的....................................... 错误!未定义书签。
实验要求....................................... 错误!未定义书签。
实验内容....................................... 错误!未定义书签。
实验过程....................................... 错误!未定义书签。
需求分析................................... 错误!未定义书签。
界面....................................... 错误!未定义书签。
写信....................................... 错误!未定义书签。
收信....................................... 错误!未定义书签。
实验体会....................................... 错误!未定义书签。
2 实验2 网络组建与实施............................. 错误!未定义书签。
实验目的....................................... 错误!未定义书签。
实验环境、要求................................. 错误!未定义书签。
实验实验环境............................... 错误!未定义书签。
实验要求.................................... 错误!未定义书签。
socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它可以在不同的计算机之间实现数据的传输和通信。
本次实验旨在通过Socket编程实现一个简单的客户端和服务器端通信,并对其进行测试和分析。
实验环境:- 操作系统:Windows 10- 开发工具:Visual Studio Code- 编程语言:Python实验步骤:1. 设计客户端和服务器端的通信协议2. 编写客户端和服务器端的代码3. 运行客户端和服务器端,并进行通信测试4. 分析通信过程中的数据传输情况实验结果:经过实验,我们成功实现了一个简单的客户端和服务器端通信程序。
在测试过程中,我们发现数据可以正常地在客户端和服务器端之间传输,而且通信过程稳定可靠。
分析:通过本次实验,我们深入了解了Socket编程的基本原理和实现方式。
Socket编程可以灵活地实现不同计算机之间的通信,为网络通信提供了重要的技术支持。
在实际应用中,Socket编程可以用于实现各种网络通信功能,如网页浏览、文件传输、视频流等。
总结:通过本次实验,我们对Socket编程有了更深入的了解,并掌握了基本的编程技巧和调试方法。
Socket编程是网络通信中的重要技术,对于计算机网络领域的学习和应用具有重要的意义。
希望通过今后的实践和学习,我们能够进一步深化对Socket编程的理解,为网络通信技术的发展做出贡献。
通过本次实验,我们对Socket编程有了更深入的了解,并掌握了基本的编程技巧和调试方法。
Socket编程是网络通信中的重要技术,对于计算机网络领域的学习和应用具有重要的意义。
希望通过今后的实践和学习,我们能够进一步深化对Socket编程的理解,为网络通信技术的发展做出贡献。
《计算机网络》课程实验报告ip.addr == 116.114.22.19 and http捉任何主机发出的Ethernet 802.3格式的帧(帧的长度字段<=1500), Ethereal 的capture filter 的filter string设置为:ether[12:2] <= 1500捕捉任何主机发出的DIX Ethernet V2(即Ethernet II)格式的帧(帧的长度字段>1500, 帧的长度字段实际上是类型字段), Ethereal的capture filter 的filter string设置为:ether[12:2] > 1500观察并分析帧结构,802.3格式的帧的上一层主要是哪些PDU?是IP、LLC还是其它哪种?答:PDU协议数据单元中,帧的上层PDU是IP分组,802.3将数据链路层分为LLC子层和MAC子层,IP分组分别要经过LLC和MAC层封装才交由物理层传输。
答:Ethernet 802.2将Ethernet II帧头的协议类型字段替换为帧长度字段,并加入LLC-802.2头,用以标记上层协议。
LLC头包含目的服务访问点(DSAP)、源服务访问点(SSAP)和控制(Control)字段。
捕捉并分析局域网上的所有ethernet broadcast广播帧,Ethereal的capturefilter 的filter string设置为:ether broadcast(1). 观察并分析哪些主机在发广播帧,这些帧的高层协议是什么?主要做什么用处?(2). 你的LAN的共享网段上连接了多少台计算机?1分钟内有几个广播帧?有否发生广播风暴?答:比如,222.20.67.218主机发的Broadcast帧的高层协议为ARP协议。
ARP为地址解析协议,简言之,在IP-以太网中,当一个上层协议要发包时,有了节点的IP地址,ARP就能提供该节点的MAC地址。
计算机网络实验报告班级:姓名:学号:实验一一.实验目的及要求编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。
二.实验原理距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。
通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。
举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。
假设一个路由器接收到来自邻居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编程实验报告一、程序代码(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的资料。
HUST-计算机⽹络实验-socket编程随笔---HUST计⽹实验:socket编程博主⼤三在读,第⼀次写随笔,⽔平有限,就当记录⼀下学习的过程,顺便⾯试前复习项⽬的时候看看。
实验要求:编写⼀个 Web 服务器软件,要求如下:基本要求:1.可配置 Web 服务器的监听地址、监听端⼝和主⽬录(不得写在代码⾥⾯,不能每配置⼀次都要重编译代码);2.能够单线程处理⼀个请求。
当⼀个客户(浏览器,如输⼊“URL:http:// 202.103.2.3/index.html”)连接时创建⼀个连接套接字;3.从连接套接字接收 http 请求报⽂,并根据请求报⽂的确定⽤户请求的⽹页⽂件;4.从服务器的⽂件系统获得请求的⽂件。
创建⼀个由请求的⽂件组成的 http 响应报⽂。
;5.经 TCP 连接向请求的浏览器发送响应,浏览器可以正确显⽰⽹页的内容;⾼级要求:1.能够传输包含多媒体(如图⽚)的⽹页给客户端,并能在客户端正确显⽰;2.在服务器端的屏幕上输出请求的来源(IP 地址、端⼝号和 HTTP 请求命令⾏);3.在服务器端的屏幕上能够输出对每⼀个请求处理的结果;4.对于⽆法成功定位⽂件的请求,根据错误原因,作相应错误提⽰,并具备⼀定的异常情况处理能⼒。
Socket套接字介绍:Socket 是⼀个抽象概念,代表了通信双⽅的端点(Endpoint),通信双⽅通过 Socket 发送或接收数据。
为了将应⽤程序和底层的⽹络通信协议屏蔽开来,采⽤套接字(Socket)这样⼀个抽象概念来作为应⽤程序和底层⽹络之间的应⽤程序编程接⼝(API)。
因为⽹络应⽤程序是进程之间的通信,为了唯⼀的标识通信对等⽅的通信进程,套接字必须包含 2 种信息:(1) 通信对等⽅的⽹络地址。
(2) 通信对等⽅的进程号,通常叫端⼝号。
构造⽅法(常⽤):ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException。
实验报告实验一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地址即可。
华中科技⼤学计算机⽹络实验报告计算机⽹络实验报告班级:电信0904姓名:XX学号:U200913693实验四:⽹络协议与Web通信⼀、实验⽬的1.了解⽹络协议数据单元的格式2.分析⽹络协议⼯作基本流程3.深⼊理解Web应⽤的通信过程⼆、实验内容1.⽹络协议数据单元分析通过wireshark抓取局域⽹数据包并分析各个层次的协议数据单元内容(1)以太⽹帧头(2)IP分组⾸部(3)ARP包(4)ICMP包(ping)2.Web原理实验(1)HTTP协议分析(2)通过socket编程模拟HTTP协议通信过程三、实验原理1.Web通信经过四个步骤:(1)建⽴连接(2)客户端发送HTTP REQUEST请求(3)服务器端接收请求,⽣成RESPONSE响应(4)关闭连接2.HTTP协议客户端浏览器或其他程序与Web服务器之间的应⽤层通信协议。
⼀般在Internet 上的Web服务器上存放的都是超⽂本信息,客户机需要通过HTTP协议传输所要访问的超⽂本信息。
四、实验内容及分析1.编译、执⾏参考程序本次实验提供了两个原始程序(NetServer.java和NetClient.java),它们可以实现⼀个服务器/客户端请求响应的完整过程。
Dos环境下先后编译执⾏NetServer.java与NetClient.java,即可得到⼀次完整的客户端向服务器请求并得到响应的完整过程,结果如下:2.修改、编写实验程序参考程序模拟了客户端与服务器之间的对话,但由于其之间交互的数据都是我们设定的⽽不含有http报头信息,因此不能和真正的web服务器与浏览器对话,以下即为实现⾃制web服务器的⽅法(1)利⽤⾃制的服务器获取真正浏览器的HTTP Request 报头信息:运⾏⾃制的服务器,默认监听端⼝8080,在浏览器中输⼊以下⽹址http://127.0.0.1:8080/new/main/UserLoad.jsp,其中127.0.0.1为本机localhost地址,这样浏览器就会向⾃制服务器发出请求,服务器即可获取http request报头信息。
电子与信息工程系
实验报告
实验名称WinSocket编程实验课程名称计算机网络
姓名郭世康学号U201313639
日期20151220 地点南一楼东204 成绩教师刘威
1.实验目的
1.掌握网络应用程序的开发方法;
2.掌握 Client/ Server 结构软件的设计与开发方法
3.掌握 Socket 机制的工作原理
4.实现server-client双向通信、client超时重传过程
2.实验环境
Windows7.0,集成开发环境codeblocks,simple-talk例程代码
3.实验内容与结果
(1)运行simplex-talk 例程,理解代码并观察现象
(2)修改simplex-talk程序,编制duplex-talk程序,支持client和server 的双向通信
程序整体功能:实现客户端与服务器的双向通信。
程序组成及各模块功能:程序由若干模块组成:主要为检查模块,检查是否出错以及是否与服务器/客户端建立了链接;传输数据模块,客户端向服务器发送数据和接受服务器发送的消息以及服务器接收数据及发送数据;关闭连接模块,断开客户端与服务器的链接;
重要的数据结构: WSADATA,hostent,sockaddr_in等数据结构;
程序清单:见附件;
运行及测试结果:
(3)利用windows时间函数,编制一个简单的定时器,模拟client和server之间的stop-and-wait
程序整体功能:实现客户端与服务器之间的stop-and-wait动作,其中延时设置为2s,主要实现方法为server收到client发过来的数据后不回传ACK,导致client 以为server没有收到,然后在延时过后重传数据;
程序组成及各模块功能:程序由若干模块组成,主要为检查模块,检查是否出错以及是否与服务器/客户端建立了链接;传输数据模块,客户端向服务器发送数据和接受服务器发送的消息以及服务器接收数据及发送数据;关闭连接模块,断开客户端与服务器的链接;
重要的数据结构: WSADATA,hostent,sockaddr_in等数据结构;
程序清单:见附件;
运行及测试结果:
4.思考题
无
5.实验中的问题
在刚开始时示例代码看不懂,弄懂simplex-talk都花了大量的时间和精力。
其中recv、accept、send等函数弄明白参量都花费了大量的精力,然而并没有弄明白其中参量的具体意义,导致现在整个实验做完了都不是很清楚。
代码看的不是很懂,更不要说写代码了。
在同学的帮助下我弄明白了这个程序的的大致模块分布和一些基本的算法思想,并且参考了大量同学的代码,其中还咨询了一些学长和学姐,总算有了一个整个的思路。
然而在开始编写的时候又遇到了麻烦:CodeBlocks下的环境配置。
运行示例代码的时候就出错,上网百度了好久都没有解决。
这个问题就困扰了我大半天的时间,搞得我烦不胜烦,都不想搞了。
最后还是隗巍同学告诉了我lib文件的导入方法及过程,环境配置才得以成功。
在编写代码的过程中,出现了N多次错误,一些函数更是不知道怎么使用,例如send、recv,在参考了同学的代码之后,总算有了一点头绪。
后面服务器接口的使用也困扰了好久,后面学长提醒才知道,服务器用于连接请求和数据传输的端口要分开使用。
服务器开放一个接口(s)用于监听来自客户端的连接请求,在建立连接后,会另外开放一个接口(new_s)用于和客户端通信,而原先的接口则用来处理其他客户端的连接请求。
写了半天,终于写好了,编译链接也没有问题,然而实际运行的时候又崩盘了。
不是client发出结果server收不到就是server 发出结果client收不到。
然后写写改改,改改写写,终于收到,然后运行,结果。
呵呵呵呵,程序卡住,停止运行,当时就想砸电脑,忍住了,又回去看代码哪里错了,找来找去找了半天结果发现有一个printf的输出错了导致程序崩溃,那时候还不确定,试着把它去了结果运行成功,当时的心情就跟吃了人参果一样,全身上下渗透着一种舒爽,恨不得仰天长啸三声。
总之这个实验做成之前有一种想死的感觉,后面解决了问题之后又很爽,不过说实话,整个实验完了之后我还有一种云里雾里的感觉,有好多地方没有很清楚的弄明白,但是结果还是差强人意,最后还是完成了一些要求的功能,还是很开心的。
附件
1. 程序源代码
2. 参考文献列表。