udp 实验Word下载.docx
- 文档编号:17620110
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:19
- 大小:65.11KB
udp 实验Word下载.docx
《udp 实验Word下载.docx》由会员分享,可在线阅读,更多相关《udp 实验Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
1.熟悉UDP协议的工作机制;
2.熟悉在JAVA环境下使用DatagramPacket数据报实现UDP通信;
3.体会UDP的无连接报投递服务;
4.编写并调试UDP协议实现程序;
5.参加答辩,并撰写实验报告。
六.程序清单
//FilePosterDlg.cpp:
implementationfile
//
#include"
stdafx.h"
FilePoster.h"
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("
发送进度:
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
m_file=NULL;
m_posting=false;
voidCFilePosterDlg:
//{{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);
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)
ON_MESSAGE(WM_READY_TO_RECEIVE,OnReadyToRecv)//自定义消息,用于分块发送文件
//CFilePosterDlgmessagehandlers
structRECVPARAM
HWNDhWnd;
SOCKETsock;
BOOLCFilePosterDlg:
OnInitDialog()
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);
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);
绑定失败!
//产生一个用于接收数据的线程
structRECVPARAM*pRecvParam=newRECVPARAM;
pRecvParam->
sock=m_socket;
hWnd=m_hWnd;
HANDLEhThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
/**************************************************************************/
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
CDialog:
OnSysCommand(nID,lParam);
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
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);
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='
;
:
PostMessage(hWnd,WM_READY_TO_RECEIVE,(WPARAM)&
wParam,0);
elseif(recvBuf[0]=='
D'
H'
for(i=1;
i<
=0x100&
&
recvBuf[i]!
='
\0'
i++)//前256字节用于存储文件名
fileName[i-1]=recvBuf[i];
fileName[i-1]='
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='
:
wParam,(LPARAM)&
addrFrom);
}
else
C'
}
else
charwParam='
:
F'
fwrite(&
recvBuf[0x12],1,0x100,file);
E'
intbufSize=atoi(&
recvBuf[1]);
recvBuf[0x12],1,bufSize,file);
fclose(file);
else
AfxMessageBox("
传送数据过程中出现错误!
return(DWORD)NULL;
//调出打开对话框查找要发送的文件
OnFindFile()
CFileDialogopenFile(true);
if(IDOK==openFile.DoModal())
m_filePath=openFile.GetPathName();
UpdateData(false);
//按下发送键,发出文件信息
OnOK()
if(m_posting)
数据发送中,请稍候再试。
return;
UpdateData();
if(m_filePath=="
请输入要发送的文件路径!
if(m_IPAddr.IsBlank())
请添入接收者的IP地址。
WIN32_FIND_DATAFindFileData;
if(INVALID_HANDLE_VALUE==FindFirstFile(m_filePath,&
FindFileData))
文件路径错误或文件不存在!
\n请重新指定文件路径。
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]='
for(i=1;
FindFileData.cFileName[i-1]!
i++)
sendBuf[i]=FindFileData.cFileName[i-1];
sendBuf[i]='
_itoa(FindFileData.nFileSizeLow,&
sendBuf[0x101],10);
sendBuf[0x111]='
sendto(m_socket,sendBuf,0x112,0,
(SOCKADDR*)&
addrTo,sizeof(SOCKADDR));
if(!
(m_file=fopen(m_filePath,"
rb"
读取文件失败!
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 实验