通信原理实验报告.docx
《通信原理实验报告.docx》由会员分享,可在线阅读,更多相关《通信原理实验报告.docx(7页珍藏版)》请在冰豆网上搜索。
通信原理实验报告
学生学号
实验课成绩
学生实验报告书
实验课程名称
通信原理
开课学院
计算机科学与技术学院
指导教师姓名
刘维
学生姓名
陈鑫宇
学生专业班级
软件工程1401
2015
--
2016
学年
第
2
学期
实验课程名称:
______通信原理_________
实验项目名称
采用Winsock在有线局域网上的点-点通信
实验成绩
实验者
陈鑫宇
专业班级
软件1401
组别
同组者
叶旺
实验日期
年月日
一部分:
实验预习报告(包括实验目的、意义,实验基本原理与方法,主要仪器设备及耗材,实验方案与技术路线等)
实验目的与要求
1.“采用Winsock在有线局域网上的点-点通信”
2.熟悉的控件和界面设计,进而熟悉Winsock的有关控件及编程方法。
3.在了解所用的两个工作站和服务器的IP地址后,采用的控件和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原语单独释放连接。
关键代码示例:
服务器端:
.\n");
len=sizeof(SOCKADDR);
while
(1)
{
采用Winsock在无线局域网上的点-点群发通信”
2.修改实验01的界面设计,设计为多个接收地址的群发界面(因为群发是一对多的循环点-点通信),并修改相应的程序。
3.在了解所用的3个工作站和服务器的IP地址后,采用的控件和Winsock控件编写并调试在无线局域网上的点-点群发通信程序。
编译语言与环境
1.本次实验采用C++编程语言版本
2.安装vs2015的Windows系统pc机
问题分析
点到群的通信就是客户端将消息发送至多个服务器端。
相当于在客户端加入一个循环,依次给不同ip的服务器发送消息。
在实验一的基础上,修改服务器端的消息响应方法可以实现点到群的通信。
实验一中点到点的通信原理是,客户端将消息发送到服务器端,然后服务器端反馈客户端相应的信息。
在本实验中可以修改为客户端将消息发送至多个服务器端,然后接受传送回来的信息。
相当于在客户端加入一个循环,依次给不同ip的服务端发送消息。
关键代码示例:
服务器端:
"
#include""
#include""
#include<>
#include<>
#pragmacomment(lib,"")
staticintnum=0;
.\n");
len=sizeof(SOCKADDR);
"
#include""
#include""
//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=;
char*ip2=;
CStringtext;
GetDlgItemText(IDC_EDIT1,text);
intnLength=();
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!
=2||HIBYTE!
=2)
{
//启动错误,程序结束
WSACleanup();
return;
}
//新建客户端scoket
sockClient=socket(AF_INET,SOCK_STREAM,0);
//定义要连接的服务端地址
=inet_addr(ip1);
=AF_INET;//协议类型是INET
=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();
//定义要连接的服务端地址二
=inet_addr(ip2);//目标IP
=AF_INET;//协议类型是INET
=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,服务器成功显示客户端发送的信息,实验成功。
实验过程中出现了编译器报错问题,查询资料,修改参数后解决了问题。
第三部分结果与讨论(可加页)
1、实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)
通过修改实验一所定义的客户端的消息发送可以实现点到多个点的群发通信,客户端依次将信息发送到第一个ip,第二个ip,第三个ip
客户端发送消息,计算机a上服务器接收到消息
计算机b上服务器接收到消息
二、小结、建议及体会
通过在实验一的基础上继续开发,我实现了多个接收地址的群发界面,更加深入了解了winsock通信机制,以及利用mfc编程实现的方法。
了解了群发是一对多的循环点-点通信,熟悉了通信的技术以及实现方法。
上课时认真学习通信原理就能快速正确的完成实验,收获知识。