udp 实验.docx
- 文档编号:4685212
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:19
- 大小:65.11KB
udp 实验.docx
《udp 实验.docx》由会员分享,可在线阅读,更多相关《udp 实验.docx(19页珍藏版)》请在冰豆网上搜索。
udp实验
沈阳工程学院
学生实验报告
实验室名称:
信息工程系网络实验室
实验课程名称:
计算机网络
实验项目名称:
Winsock-编程UDP客户机/服务器编程实现
班级:
姓名:
学号:
实验日期:
2012年05月19日实验台编号:
指导教师:
批阅教师(签字):
成绩:
一.实验目的
1.掌握网络应用程序的开发方法;
2.掌握基于UDP协议的Client/Server结构软件的设计与开发。
二.实验内容
以UDP协议为基础,以C/S方式实现数据通信功能
三.实验前的准备
●了解UDP协议的基本工作原理;
●掌握c/s基本概念以及特点;
●掌握相关软件编程知识。
四.实验要求及实验软硬件环境
【基本要求】
●设计程序完成基于UDP协议的C/S程序;
●程序主要包括客户端和服务端;
●完成此项实验,完成实验报告。
【实验组织方式】
●小组实验
【实验条件】
●微机与编程软件。
五.实验步骤
1.熟悉UDP协议的工作机制;
2.熟悉在JAVA环境下使用DatagramPacket数据报实现UDP通信;
3.体会UDP的无连接报投递服务;
4.编写并调试UDP协议实现程序;
5.参加答辩,并撰写实验报告。
六.程序清单
//FilePosterDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"FilePoster.h"
#include"FilePosterDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
CStringm_dsc;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
m_dsc=_T("本程序运用UDP原理进行文件的传输,文件被分割为256B的数据块,为保证数据块的传输顺序,采用自定义Windows消息进行同步,即每接受完一个数据块给出一个消息,发送法受到消息后发送数据。
");
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
DDX_Text(pDX,IDC_EDIT,m_dsc);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CFilePosterDlgdialog
intCFilePosterDlg:
:
nFileSize=0;
CFilePosterDlg:
:
CFilePosterDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CFilePosterDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CFilePosterDlg)
m_filePath=_T("");
m_recv=_T("接受进度:
");
m_send=_T("发送进度:
");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_file=NULL;
m_posting=false;
}
voidCFilePosterDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFilePosterDlg)
DDX_Control(pDX,IDC_PROGRESS_RECV,m_progress_r);
DDX_Control(pDX,IDC_PROGRESS_SEND,m_progress);
DDX_Control(pDX,IDC_IP_ADDR,m_IPAddr);
DDX_Text(pDX,IDC_FILE_PATH,m_filePath);
DDX_Text(pDX,IDC_RECV,m_recv);
DDX_Text(pDX,IDC_SEND,m_send);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFilePosterDlg,CDialog)
//{{AFX_MSG_MAP(CFilePosterDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_FIND_FILE,OnFindFile)
ON_COMMAND(ID_MENU_SEND,OnMenuSend)
ON_COMMAND(ID_MENU_QUIT,OnMenuQuit)
ON_COMMAND(ID_ABOUT,OnAbout)
ON_COMMAND(ID_MENU_FIND,OnMenuFind)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_READY_TO_RECEIVE,OnReadyToRecv)//自定义消息,用于分块发送文件
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CFilePosterDlgmessagehandlers
structRECVPARAM
{
HWNDhWnd;
SOCKETsock;
};
BOOLCFilePosterDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//m_progress.SetRange(0,10000);
//m_progress_r.SetRange(0,10000);
m_progress.SetStep
(1);
m_progress_r.SetStep
(1);
/***********************************************************************/
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox("套接字创建失败!
");
returnFALSE;
}
SOCKADDR_INaddrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6800);
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
intretval;
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(m_socket);
MessageBox("绑定失败!
");
returnFALSE;
}
//产生一个用于接收数据的线程
structRECVPARAM*pRecvParam=newRECVPARAM;
pRecvParam->sock=m_socket;
pRecvParam->hWnd=m_hWnd;
HANDLEhThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
/**************************************************************************/
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCFilePosterDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCFilePosterDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCFilePosterDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
//接收线程的回调函数
DWORDWINAPICFilePosterDlg:
:
RecvProc(LPVOIDlpParameter)
{
SOCKETsock=((RECVPARAM*)lpParameter)->sock;
HWNDhWnd=((RECVPARAM*)lpParameter)->hWnd;
deletelpParameter;
SOCKADDR_INaddrFrom;
intlen=sizeof(SOCKADDR);
charrecvBuf[0x112];//256+17字节的缓冲
charfileName[0x100];
intretval,i;
FILE*file=NULL;
while(TRUE)
{
retval=recvfrom(sock,recvBuf,0x112,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR==retval)
break;
if(recvBuf[0]=='R')
{
charwParam='R';
:
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&wParam,0);
}
elseif(recvBuf[0]=='D')
{
charwParam='D';
:
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&wParam,0);
}
elseif(recvBuf[0]=='H')
{
for(i=1;i<=0x100&&recvBuf[i]!
='\0';i++)//前256字节用于存储文件名
fileName[i-1]=recvBuf[i];
fileName[i-1]='\0';
CStringrecvMsg;
nFileSize=atoi(&recvBuf[0x101]);
recvMsg.Format("收到来自于(%s)的文件:
%s\n文件大小:
%i字节\n是否接收?
",
inet_ntoa(addrFrom.sin_addr),fileName,nFileSize);
if(IDOK==AfxMessageBox(recvMsg,MB_OKCANCEL))
{
CFileDialogsaveDlg(false,NULL,fileName);
if(IDOK==saveDlg.DoModal())
{
if(!
(file=fopen(saveDlg.GetPathName(),"wb")))
{
AfxMessageBox("创建本地文件失败!
");
continue;
}
charwParam='H';
:
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&wParam,(LPARAM)&addrFrom);
}
else
{
charwParam='C';
:
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&wParam,(LPARAM)&addrFrom);
}
}
else
{
charwParam='C';
:
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&wParam,(LPARAM)&addrFrom);
}
}
elseif(recvBuf[0]=='F')
{
fwrite(&recvBuf[0x12],1,0x100,file);
charwParam='F';
:
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&wParam,(LPARAM)&addrFrom);
}
elseif(recvBuf[0]=='E')
{
intbufSize=atoi(&recvBuf[1]);
fwrite(&recvBuf[0x12],1,bufSize,file);
fclose(file);
charwParam='E';
:
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&wParam,(LPARAM)&addrFrom);
}
else
AfxMessageBox("传送数据过程中出现错误!
");
}
return(DWORD)NULL;
}
//调出打开对话框查找要发送的文件
voidCFilePosterDlg:
:
OnFindFile()
{
CFileDialogopenFile(true);
if(IDOK==openFile.DoModal())
{
m_filePath=openFile.GetPathName();
UpdateData(false);
}
}
//按下发送键,发出文件信息
voidCFilePosterDlg:
:
OnOK()
{
if(m_posting)
{
MessageBox("数据发送中,请稍候再试。
");
return;
}
UpdateData();
if(m_filePath=="")
{
MessageBox("请输入要发送的文件路径!
");
return;
}
if(m_IPAddr.IsBlank())
{
MessageBox("请添入接收者的IP地址。
");
return;
}
WIN32_FIND_DATAFindFileData;
if(INVALID_HANDLE_VALUE==FindFirstFile(m_filePath,&FindFileData))
{
MessageBox("文件路径错误或文件不存在!
\n请重新指定文件路径。
");
return;
}
DWORDdwIP;
m_IPAddr.GetAddress(dwIP);
SOCKADDR_INaddrTo;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6800);
addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
charsendBuf[0x112];
inti;
sendBuf[0]='H';
for(i=1;i<=0x100&&FindFileData.cFileName[i-1]!
='\0';i++)
sendBuf[i]=FindFileData.cFileName[i-1];
sendBuf[i]='\0';
_itoa(FindFileData.nFileSizeLow,&sendBuf[0x101],10);
sendBuf[0x111]='\0';
sendto(m_socket,sendBuf,0x112,0,
(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
if(!
(m_file=fopen(m_filePath,"rb")))
{
MessageBox("读取文件失败!
");
}
m_nSend=0;
m_nFileSize_s=FindFileData.nFileSizeLow;
m_progress.SetRange(0,m_nFileSize_s/0x100+1);
m_posting=true;
}
//消息响应函数,每响应一次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- udp 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)