《網(wǎng)路編程技術(shù)課程設(shè)計局域網(wǎng)文件傳輸系統(tǒng)》由會員分享,可在線閱讀,更多相關(guān)《網(wǎng)路編程技術(shù)課程設(shè)計局域網(wǎng)文件傳輸系統(tǒng)(15頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
河北科技大學
課程設(shè)計報告
學生姓名: 學 號:
專業(yè)班級: 網(wǎng)絡(luò) 081
課程名稱: 網(wǎng)絡(luò)編程技術(shù)
學年學期: 2 010—2 011 學年 第 2 學期
指導教師:
2 0 11年 6月
- 1 -
課程設(shè)計成績評定表
學生姓名
學 號
成績
專業(yè)班級
網(wǎng)絡(luò)081
起止時間
20
2、11.6.6-2011.6.12
設(shè)計題目
局域網(wǎng)文件傳輸系統(tǒng)
指
導
教
師
評
語
指導教師:
年 月 日
目 錄
1.設(shè)計題目 1
2.設(shè)計目的 1
3.設(shè)計要求 1
4.程序設(shè)計過程 1
4.1設(shè)計分析 1
4.2程序流程圖 2
5.程序源代碼 2
5.1 獲取在線用戶名及IP 2
5.2發(fā)送文
3、件及接收文件 4
5.3刷新列表 6
5.4輸及退出 6
6.運行調(diào)試 7
6.1文件傳輸運行主界面窗口 7
6.2發(fā)送文件及接收文件界面 8
6.3中止文件傳輸界面 10
6.4刷新列表界面 11
7.總結(jié) 11
7.1主要問題 11
7.2收獲心得 ...12
1.設(shè)計題目
局域網(wǎng)文件傳輸系統(tǒng)
2.設(shè)計目的
1. 基本掌握設(shè)計課題的基本步驟和方法;
2. 掌握可視化開發(fā)具體的使用;
3. 根據(jù)課題的要求進行上機調(diào)試;
4. 掌握面相對象編程的基本思路和方法;
5. 掌握socket的建立、監(jiān)聽、連接和數(shù)據(jù)收發(fā)編程實現(xiàn)。
3.設(shè)計要求
1. 實現(xiàn)局
4、域網(wǎng)內(nèi)多臺計算機間的文件傳送,達到共享的目的;
2. 程序能夠動態(tài)的監(jiān)聽在線用戶,并自動獲得機器名及相應(yīng)IP;
3. 能夠隨時終止文件的傳輸;
4. 雙方可知道對方的狀態(tài),以及文件的接受率,傳輸率及文件大小的情況,可隨時中止和退出接受。
4.程序設(shè)計過程
4.1設(shè)計分析
本系統(tǒng)的開發(fā)采用基于winsocket的廣播發(fā)送模式,在局域網(wǎng)內(nèi)進行全網(wǎng)廣播,以得到在線用戶的主機名和相應(yīng)的IP。根據(jù)FTP協(xié)議的特點采用TCP鏈路進行傳輸控制,UDP組播進行數(shù)據(jù)傳輸?shù)姆绞?,實現(xiàn)文件的傳輸。設(shè)計為了方便,可以設(shè)計出FMV類圖形用戶界面,并添加相應(yīng)的相應(yīng)按鈕。
4.2程序流程圖
圖 1 程序
5、流程圖
5.程序源代碼
5.1 獲取在線用戶名及IP
void CFiletransDlg::BroadCastSend()
{
//發(fā)請求返回在線確認消息,以獲得在線用戶信息。
sockaddr_in addrTo;
addrTo.sin_addr.S_un.S_addr=htonl(INADDR_BROADCAST);
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(RECVPORT);
//獲取主機名
char phost[200];
char temp[400];
memset(phost,
6、0,200);
memset(temp,0,400);
if( 0==gethostname(phost,200))
;
else
strcpy(phost,"Yang");
strcpy(temp,"\t\t\t\t");//指定報頭為請求返回在線確認消息。
strcat(temp,phost);
//向本子網(wǎng)內(nèi)請求返回在線確認消息。
int err=sendto(m_sockSend,temp,strlen(temp)+1,0,(sockaddr*)&addrTo,sizeof(sockaddr));
if(SOCKET_ERROR
7、==err)
{
//MessageBox("廣播發(fā)送數(shù)據(jù)失敗。");
return;
}
err=sendto(m_sockSend,temp,strlen(temp)+1,0,(sockaddr*)&addrTo,sizeof(sockaddr));
if(SOCKET_ERROR==err)
{
//MessageBox("廣播發(fā)送數(shù)據(jù)失敗。");
return;
}
}
5.2發(fā)送文件及接收文件
//發(fā)送文件
void CFiletransDlg::OnSendFile()
{ // TODO: Add your contro
8、l notification handler code here
CString ip;
if(!GetIPAddr(ip))
{ return ; }
int modal,nCount; //modal表示返回對話框的結(jié)果
CString fileName; //文件的名字
CFileDialog fdlg(true); //打開文件對話框
modal=fdlg.DoModal();
if(IDCANCEL==modal)
{ return; //用戶取消發(fā)送。 }
SENDFILEPARAM* p=new SENDFILEPARAM;
9、fileName=fdlg.GetFileName();
p->pathName=fdlg.GetPathName();
nCount=fileName.GetLength();
memset(p->fileName,0,NAMELENGTH);
for(int i=0;ifileName[i]=fileName.GetAt(i); }
p->pCLAN=this;
p->ip=ip;
::AfxBeginThread(SendFileSingle,(LPVOID)p);
return;}
//收文件
UINT Sa
10、veFileSingle(LPVOID param)
{ SAVEFILEPARAM sp;
sp.pCLAN=((SAVEFILEPARAM*)param)->pCLAN;
sp.sock=((SAVEFILEPARAM*)param)->sock;
CSocket sock;
sock.Attach(sp.sock);
DWORD Length;
char fileName[NAMELENGTH];
CString savePathName;
int modal,err;
memset(fileName,0,NAMELENGTH);
err=
11、sock.Receive(&Length,sizeof(DWORD));//接收文件長度
if(0==err)
{ AfxMessageBox("連接被關(guān)閉了。");
sock.Close();
//重置事件對象為有信號狀態(tài),準備下次接收 。
if(!SetEvent(g_hEventRecv))
{return 0;}
if(0==finish)
{ CString strFinis;
if(step
12、ox(strFinis);}
else{CString strFinish;
strFinish.Format("已成功接收文件\r\n\r\n%s",fileName);
AfxMessageBox(strFinish);}
}
else { if(!m_stop)
{ m_stop=true;
CString strFinis;
strFinis.Format("接受方停止接受\r\n\r\n%s",fileName);
AfxMessageBox(strFinis);}
}
return 0;}
5.3刷新列表
void
13、 CFiletransDlg::OnFlushList()
{ int nListItemCount=this->m_IPlist.GetItemCount();
for(int i=0;im_IPlist.DeleteItem(i);}
BroadCastSend();
}
5.4輸及退出
//中止文件傳輸
void CFiletransDlg::OnStoptrans()
{ if(MessageBox(_T("真的要停止文件傳輸嗎?"), _T("警告"), MB_ICONEXCLAMATION|M
14、B_YESNO) == IDYES)
{m_stop = false;
return ;}
}
//退出
void CFiletransDlg::OnClose()
{ BroadCastExit(); //通知其他主機我下線了。
if(INVALID_SOCKET!=m_sockRecv)
closesocket(m_sockRecv);
if(INVALID_SOCKET!=m_sockSend)
closesocket(m_sockSend);
ResetEvent(g_hEventRecv);
ResetEvent(g_hEvent
15、Send);
DeleteCriticalSection(&g_criticalSend);
DeleteCriticalSection(&g_criticalRecv);
CDialog::OnCancel();
CDialog::OnClose();
}
6.運行調(diào)試
6.1文件傳輸運行主界面窗口
圖2 文件傳輸主界面
6.2發(fā)送文件及接收文件界面
圖 3 發(fā)送文件界面
圖 4 接收文件窗口
圖 5 文件傳輸過程顯示
圖 6 接收文件成功界面
6.3中止文件傳輸界面
圖 7 文件中止傳輸確定
16、
圖8中止傳輸后返回錯誤界面
6.4刷新列表界面
圖 9 刷新界面對比
7.總結(jié)
7.1主要問題
1. 如何設(shè)計選擇多個用戶接收同一個文件;
2. 如何一次選擇傳輸多個文件;
3. 怎樣可以傳輸整個未打包文件夾
7.2收獲心得
在一起討論著完成這個過程中,雖然自己不是知道很多,雖然自己沒能夠編寫多少代碼,不過在這個過程中確實學到了很多。在要添加進度條去顯示傳輸百分多少功能時,通過上網(wǎng)查,看書,也找到了相應(yīng)的函數(shù)并添加成功了。更換了原來就有的圖標,雖然簡單,卻也知道了方法。也知道了要用全廣播進行局域網(wǎng)廣播以獲取在線主機名及主機IP。自己動手確實能夠?qū)W到很多東西,而且會學的很快。
- 12 -