计算机网络实验报告(3)

2019-03-09 20:06

case 4: changeRoute(); system(\ case 5: cout << \输入目标节点和源节点:\ cin >> desNode; cin >> rouNode; dijkstra(desNode,rouNode,path); //求最短路径 system(\ system(\ break;

case 6:routeTables.open(routeTable); if(routeTables==NULL) {

cout << \打开文件夹错误:\ getchar();

exit(0); }

//保存文件

saveRoute(routeTables); routeTables.close(); system(\ break;

case 7: displayRouteInfo();system(\ case 8: return 0;

default: system(\ } cout << \返回选择菜单(y 或者 n):\ cin >> ch;

if(ch == 'n') break; }while(ch == 'y'); system(\ return 0; }

实验二Socket通信实验

一.实验目的与要求

1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法; 2.掌握客户/服务器(C/S)应用的工作方式; 3.学习网络中进程之间通信的原理和实现方法; 4.理解单播、组播和广播的原理并比较其不同之处; 5.要求本机既是客户端又是服务器端;

二.实验内容与实现原理

1.实验内容

所编写的程序应具有如下功能:

1.具有点对点通信功能,任意客户端之间能够发送消息;

2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到; 3.具有广播功能,客户端能够向所有其他成员广播消息;

2.实现原理

socket非常类似于电话插座。以一个国家级电话网为例,电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。假如对方在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。 在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的技术细节对他都是透明的,这也与socket机制非常相似。socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。

至此,我们对socket进行了直观的描述。抽象出来,socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。在网间网内部,每一个socket用一个半相关描述:

(协议,本地地址,本地端口)

一个完整的socket有一个本地唯一的socket号,由操作系统分配。

最重要的是,socket 是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket系统调用。客户随机申请一个socket (相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的 socket ,

任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。

socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket 半相关为全局所公认非常重要。读者不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的socket 固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。

所谓socket通常也称作\套接字\,应用程序通常通过\套接字\向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

三.实验具体设计实现及结果

(含流程图及关键代码说明)

流程图

配置Windows Socket版本 出现错误 服务端 结束

版本支持 server

定义服务端 本机IP 设置服务端 协议类型是INET 将服务端 绑定端口6000 socket 绑定在本地端口 设定监听端 阻塞进程,等待客户端连接

客户端 连接 client

向客户端发送字符串 获取客户端返回的数据 服务端 循环 客户端向服务端发送消息 结束 server Server服务端代码:

#include #include

#pragma comment(lib,\#define Port 3578 #define MaxSize 1024 void main() {

//加载套接字

WORD wVersionRequested; WSADATA wsaData; int err;

wVersionRequested=MAKEWORD(2,2);

err = WSAStartup(wVersionRequested,&wsaData); if (err!=0) {

printf(\版本不足要求\\n\return; }

if (LOBYTE(wsaData.wVersion)!=2|| HIBYTE(wsaData.wVersion)!=2) {

WSACleanup(); return; }

//创建监听的套接字

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;

//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(Port); //绑定套接字

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //将套接字设置为监听模式,准备接受用户请求 listen(sockSrv,5);

SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR);

printf(\欢迎进入服务器!\\n请输入您的用户名!\\n\ while (1) {

//等待用户请求到来

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[MaxSize];

sprintf(sendBuf,\//发送数据

send(sockConn,sendBuf,MaxSize,0); //接收数据

char revBuf[MaxSize]; char name[20] = {0}; int flag = 1;

while(recv(sockConn,revBuf,MaxSize,0) != -1) {

//打印接受数据 if(flag == 1) {

strcpy(name, revBuf);

printf(\用户%s 进入!\\n\flag = 2; } else {

printf(\} }

//关闭套接字

closesocket(sockConn); } }

Client客户端代码:

#include #include

#pragma comment(lib,\#define Port 3578 #define MaxSize 1024 void main() {

WORD wVersionRequested; WSADATA wsaData; int err;

wVersionRequested=MAKEWORD(2,2);

err=WSAStartup(wVersionRequested,&wsaData); if (err!=0) {

printf(\版本不足要求\\n\return; }

if (LOBYTE(wsaData.wVersion)!=2||


计算机网络实验报告(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:八达岭项目定稿 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: