通信原理实验报告.docx
- 文档编号:24843722
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:16
- 大小:243.42KB
通信原理实验报告.docx
《通信原理实验报告.docx》由会员分享,可在线阅读,更多相关《通信原理实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
通信原理实验报告
学生学号
0121410880117
实验课成绩
学生实验报告书
实验课程名称
通信原理
开课学院
计算机科学与技术学院
指导教师姓名
刘维
学生姓名
陈鑫宇
学生专业班级
软件工程1401
2015
--
2016
学年
第
2
学期
实验课程名称:
______通信原理_________
实验项目名称
采用Winsock在有线局域网上的点-点通信
实验成绩
实验者
陈鑫宇
专业班级
软件1401
组别
同组者
叶旺
实验日期
年月日
一部分:
实验预习报告(包括实验目的、意义,实验基本原理与方法,主要仪器设备及耗材,实验方案与技术路线等)
实验目的与要求
1.“采用Winsock在有线局域网上的点-点通信”
2.熟悉VB6.0的控件和界面设计,进而熟悉Winsock的有关控件及编程方法。
3.在了解所用的两个工作站和服务器的IP地址后,采用VB6.0的控件和Winsock控件编写并调试在有线局域网上的点-点通信程序。
4.具有点对点通信功能,任意客户端之间能够发送消息。
编译语言与环境
1.编程语言C/C++等均可;本次实验采用C++语言版本
2.安装vs2015或更高版本的Windows系统pc机
网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。
具体流程如上图所示。
1、建立连接
1)服务程序调用socket创建一个新的套接字,并在传输层实体中分配表空间,返回一个文件描述符用于以后调用中使用该套接字;调用bind将一个地址赋予该套接字,使得远程客户程序能访问该服务程序;调用listen分配数据空间,以便存储多个用户的连接建立请求;调用accept将服务程序阻塞起来,等待接收客户程序发来的连接请求。
当传输层实体接收到建立连接的TPDU时,新创建一个和原来的套接字相同属性的套接字并返回其文件描述符。
服务程序创建一个子进程处理此次连接,然后继续等待发往原来套接字的连接请求。
2)客户程序调用socket创建一个新的套接字,并在传输层实体中分配表空间,返回一个文件描述符用于在以后的调用中使用该套接字;调用connect阻塞客户程序,传输层实体开始建立连接,当连接建立完成时,取消阻塞;
2、数据传输
双方使用send和receive完成数据的全双工发送。
3、释放连接
每一方使用close原语单独释放连接。
关键代码示例:
服务器端:
//定义服务器端socket
sockServer=socket(AF_INET,SOCK_STREAM,0);
//设置服务器端socket
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//本机IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);
//将服务器socket绑定在本地端口
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//Listen监听端口
listen(sockServer,10);//10为等待连接数目
printf("服务器已启动:
\n监听中...\n");
len=sizeof(SOCKADDR);
while
(1)
{
//accept会阻塞进程,直到有客户端连接上来为止
sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len);
//当客户端连接上来时,拼接字符串
sprintf(sendBuf,"欢迎ip:
%s的用户连接,这里是陈鑫宇的服务器,欢迎使用\n",inet_ntoa(addrClient.sin_addr));
//向客户端发送字符串
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
//获取客户端返回的数据
recv(sockClient,recvBuf,100,0);
//打印客户端返回的数据
printf("%s\n",recvBuf);
//关闭socket
closesocket(sockClient);
}
客户端:
//新建服务器端scoket
sockServer=socket(AF_INET,SOCK_STREAM,0);
//定义要连接的服务端地址
addrServer.sin_addr.S_un.S_addr=inet_addr("10.139.14.180");//目标IP(100.64.175.119是本机地址)
addrServer.sin_family=AF_INET;//协议类型是INET
addrServer.sin_port=htons(6000);//连接端口1234
//让sockClient连接到服务端
connect(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//从服务端获取数据
recv(sockServer,recvBuf,100,0);
//打印数据
printf("服务器端输入:
%s\n",recvBuf);
message="大家好,我是叶旺";
printf("向服务器发送:
%s\n",message);
//发送数据到服务端
send(sockServer,message,strlen(message)+1,0);
//关闭socket
closesocket(sockServer);
WSACleanup();
第二部分:
实验过程记录(可加页)(包括实验原始数据记录,实验现象记录,实验过程发现的问题等)
服务器ip地址为192.168.1.110
客户端发送的信息成功传输到了服务器并显示了出来,
第三部分结果与讨论(可加页)
1、实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)
打开服务器程序,然后点击开始通信按钮,打开客户端程序在客户端输入数据,数据成功从客户端传输到了服务器端,并成功显示了出来,实验成功。
二、小结、建议及体会
通过本次实验能够感受到网络在实际当中的运用,使我对网络编程有了更深的概念。
同时让我发现自己知识结构的欠缺。
虽然基本功能已经实现,但还是存在很多不稳定的问题尚待解决。
此次实验是对Socket的一个应用,让我更深的了解了Socket函数的作用及使用方法。
实验过程中遇到了很多的问题,例如:
程序只能通信一次。
刚开始我以为建立的socket套接口只要建立一次并更新连接地址就可以多次使用。
当初不知道问题存在的在于这,在程序加入很多错误报告代码,发现再客户端再次connect的时候返回负值。
在网上查看很多相关代码之后,发现问题所在,把建立socket的代码写进客户端的循环体中,每次通信都重新建立socket套接口就可以了。
实验项目名称
采用Winsock在无线局域网上的点-点群发通信
实验成绩
实验者
陈鑫宇
专业班级
软件1401
组别
同组者
叶旺,杨彪
实验日期
年月日
一部分:
实验预习报告(包括实验目的、意义,实验基本原理与方法,主要仪器设备及耗材,实验方案与技术路线等)
实验目的与要求
1.“采用Winsock在无线局域网上的点-点群发通信”
2.修改实验01的界面设计,设计为多个接收地址的群发界面(因为群发是一对多的循环点-点通信),并修改相应的程序。
3.在了解所用的3个工作站和服务器的IP地址后,采用VB6.0的控件和Winsock控件编写并调试在无线局域网上的点-点群发通信程序。
编译语言与环境
1.本次实验采用C++编程语言版本
2.安装vs2015的Windows系统pc机
问题分析
点到群的通信就是客户端将消息发送至多个服务器端。
相当于在客户端加入一个循环,依次给不同ip的服务器发送消息。
在实验一的基础上,修改服务器端的消息响应方法可以实现点到群的通信。
实验一中点到点的通信原理是,客户端将消息发送到服务器端,然后服务器端反馈客户端相应的信息。
在本实验中可以修改为客户端将消息发送至多个服务器端,然后接受传送回来的信息。
相当于在客户端加入一个循环,依次给不同ip的服务端发送消息。
关键代码示例:
服务器端:
//server.cpp:
实现文件
//
#define_CRT_SECURE_NO_WARNINGS
#include"stdafx.h"
#include"通信实验.h"
#include"server.h"
#include"afxdialogex.h"
#include
#include
#pragmacomment(lib,"ws2_32.lib")
staticintnum=0;
//server对话框
IMPLEMENT_DYNAMIC(server,CDialogEx)
server:
:
server(CWnd*pParent/*=NULL*/)
:
CDialogEx(IDD_DIALOG1,pParent)
{
}
server:
:
~server()
{
}
voidserver:
:
DoDataExchange(CDataExchange*pDX)
{
CDialogEx:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(server,CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1,&server:
:
OnBnClickedButton1)
ON_WM_TIMER()
END_MESSAGE_MAP()
//server消息处理程序
voidserver:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
//SetTimer(1,50000,NULL);
interr;//错误信息
intlen;
charsendBuf[100];//发送至客户端的字符串
charrecvBuf[100];//接受客户端放回的字符串
SOCKETsockServer;//服务器端Socket
SOCKADDR_INaddrServer;//服务器端地址
SOCKETsockClient;//客户端Socket
SOCKADDR_INaddrClient;//客户端地址
WSADATAwsaData;//winsock结构体
WORDwVersinRequested;//winsock版本
//配置WindowsSocket版本
wVersinRequested=MAKEWORD(2,2);
//初始化WindowsSocket
err=WSAStartup(wVersinRequested,&wsaData);
if(err!
=0)
{
//启动错误,程序结束
return;
}
/*
确认WinSockDLL支持2.2
*/
if(LOBYTE(wsaData.wVersion)!
=2||HIBYTE(wsaData.wVersion)!
=2)
{
//启动错误
WSACleanup();//终止WinSock2DLL的使用
return;
}
//定义服务器端socket
sockServer=socket(AF_INET,SOCK_STREAM,0);
//设置服务器端socket
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//本机IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);
//将服务器socket绑定在本地端口
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//Listen监听端口
listen(sockServer,5);//5为等待连接数目
printf("服务器已启动:
\n监听中...\n");
len=sizeof(SOCKADDR);
//accept会阻塞进程,直到有客户端连接上来为止
sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len);
//当客户端连接上来时,拼接字符串
sprintf(sendBuf,"欢迎ip:
%s的用户连接,发送成功,欢迎使用\n",inet_ntoa(addrClient.sin_addr));
//向客户端发送字符串
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
//获取客户端返回的数据
recv(sockClient,recvBuf,100,0);
//打印客户端返回的数据
CStringtext;
text=recvBuf;
SetDlgItemText(IDC_EDIT1,text);
//关闭socket
closesocket(sockClient);
}
客户端:
#include
#include
#pragmacomment(lib,"ws2_32.lib")
#include"stdafx.h"
#include"通信实验.h"
#include"client.h"
#include"afxdialogex.h"
//client对话框
IMPLEMENT_DYNAMIC(client,CDialogEx)
client:
:
client(CWnd*pParent/*=NULL*/)
:
CDialogEx(IDD_DIALOG2,pParent)
{
}
client:
:
~client()
{
}
voidclient:
:
DoDataExchange(CDataExchange*pDX)
{
CDialogEx:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(client,CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1,&client:
:
OnBnClickedButton1)
END_MESSAGE_MAP()
//client消息处理程序
voidclient:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
char*ip1="192.168.1.110";
char*ip2="192.168.1.111";
CStringtext;
GetDlgItemText(IDC_EDIT1,text);
intnLength=text.GetLength();
intnBytes=WideCharToMultiByte(CP_ACP,0,text,nLength,NULL,0,NULL,NULL);
char*message=newchar[nBytes+1];
memset(message,0,nLength+1);
WideCharToMultiByte(CP_OEMCP,0,text,nLength,message,nBytes,NULL,NULL);
message[nBytes]=0;
interr;
charrecvBuf[100];
SOCKETsockClient;//客户端Scoket
SOCKADDR_INaddrServer;//服务端地址
WSADATAwsaData;
WORDwVersionRequested;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!
=2||HIBYTE(wsaData.wVersion)!
=2)
{
//启动错误,程序结束
WSACleanup();
return;
}
//新建客户端scoket
sockClient=socket(AF_INET,SOCK_STREAM,0);
//定义要连接的服务端地址
addrServer.sin_addr.S_un.S_addr=inet_addr(ip1);//目标IP(175.0.170.28是本机地址)
addrServer.sin_family=AF_INET;//协议类型是INET
addrServer.sin_port=htons(6000);//连接端口1234
//让sockClient连接到服务端
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//发送数据到服务端
send(sockClient,message,strlen(message)+1,0);
//从服务端获取数据
recv(sockClient,recvBuf,100,0);
//打印数据
text=recvBuf;
SetDlgItemText(IDC_EDIT2,text);
//关闭socket
closesocket(sockClient);
WSACleanup();
//定义要连接的服务端地址二
addrServer.sin_addr.S_un.S_addr=inet_addr(ip2);//目标IP
addrServer.sin_family=AF_INET;//协议类型是INET
addrServer.sin_port=htons(6000);//连接端口1234
//让sockClient连接到服务端
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//发送数据到服务端
send(sockClient,message,strlen(message)+1,0);
//从服务端获取数据
recv(sockClient,recvBuf,100,0);
//打印数据
text=recvBuf;
SetDlgItemText(IDC_EDIT2,text);
//关闭socket
closesocket(sockClient);
WSACleanup();
}
第二部分:
实验过程记录(可加页)(包括实验原始数据记录,实验现象记录,实验过程发现的问题等)
客户端分别将数据传输到服务器a和服务器b,服务器成功显示客户端发送的信息,实验成功。
实验过程中出现了编译器报错问题,查询资料,修改参数后解决了问题。
第三部分结果与讨论(可加页)
2、实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)
通过修改实验一所定义的客户端的消息发送可以实现点到多个点的群发通信,客户端依次将信息发送到第一个ip,第二个ip,第三个ip
客户端发送消息,计算机a上服务器接收到消息
计算机b上服务器接收到消息
二、小结、建议及体会
通过在实验一的基础上继续开发,我实现了多个接收地址的群发界面,更加深入了解了winsock通信机制,以及利用mfc编程实现的方法。
了解了群发是一对多的循环点-点通信,熟悉了通信的技术以及实现方法。
上课时认真学习通信原理就能快速正确的完成实验,收获知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通信 原理 实验 报告