實(shí)驗(yàn)5廣播通信設(shè)計(jì)_第1頁(yè)
實(shí)驗(yàn)5廣播通信設(shè)計(jì)_第2頁(yè)
實(shí)驗(yàn)5廣播通信設(shè)計(jì)_第3頁(yè)
實(shí)驗(yàn)5廣播通信設(shè)計(jì)_第4頁(yè)
實(shí)驗(yàn)5廣播通信設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

計(jì)算機(jī)與信息學(xué)院《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)實(shí)踐》報(bào)告設(shè)計(jì)題目:廣播通信設(shè)計(jì)學(xué)生姓名:學(xué) 號(hào):專業(yè)班級(jí):計(jì)算機(jī)06-4班,.2009年9月合肥工業(yè)大學(xué)課程設(shè)計(jì)任務(wù)書姓名 學(xué)號(hào) 班級(jí) 計(jì)算機(jī)06-4班,.設(shè)計(jì)廣播通信設(shè)計(jì)成績(jī)題目課1.掌握廣播通信技術(shù);程2.了解基于WinsockAPI的消息機(jī)制和編程應(yīng)用方法;設(shè)計(jì)3.了解WindowsSDK編程架構(gòu)。主4.WinSockAPI編程,實(shí)現(xiàn)局域網(wǎng)消息廣播的實(shí)用程序;要內(nèi)5.通過查閱資料,簡(jiǎn)述單播、廣播、多播的區(qū)別和聯(lián)系,以及各自的優(yōu)缺點(diǎn)和容適應(yīng)范圍。指導(dǎo)教師評(píng)語(yǔ)簽名:200年月日一、設(shè)計(jì)要求1.WinSockAPI編程,實(shí)現(xiàn)局域網(wǎng)消息廣播的實(shí)用程序;感謝閱讀,.2.通過查閱資料,簡(jiǎn)述單播、廣播、多播的區(qū)別和聯(lián)系,以及各自的優(yōu)缺點(diǎn)精品文檔放心下載和適應(yīng)范圍。二、開發(fā)環(huán)境與工具M(jìn)icrosoftVisualStudio2008.感謝閱讀WindowsXPSP3.三、設(shè)計(jì)原理Socket接口是網(wǎng)絡(luò)編程(通常是 TCP/IP協(xié)議,也可以是其他協(xié)議)謝謝閱讀API。最早的Socket接口是Berkeley接口,在Unix操作系統(tǒng)中實(shí)現(xiàn)。感謝閱讀WinSock也是一個(gè)基于Socket模型的API,在MicrosoftWindows操作系統(tǒng)類中使用。它在Berkeley接口函數(shù)的基礎(chǔ)之上,還增加了基于消息驅(qū)動(dòng)機(jī)制的Windows擴(kuò)展函數(shù)。Winscok1.1只支持TCP/IP網(wǎng)絡(luò),WinSock2.0增加了對(duì)更多協(xié)議的支持。謝謝閱讀單播:網(wǎng)絡(luò)節(jié)點(diǎn)之間的通信就好像是人們之間的對(duì)話一樣。如果一個(gè)人對(duì)另外一個(gè)人說(shuō)話,那么用網(wǎng)絡(luò)技術(shù)的術(shù)語(yǔ)來(lái)描述就是“單播”,此時(shí)信息的接收和傳遞只在兩個(gè)節(jié)點(diǎn)之間進(jìn)行。感謝閱讀多播:“多播”也可以稱為“組播”,在網(wǎng)絡(luò)技術(shù)的應(yīng)用并不是很多,網(wǎng)上視頻會(huì)議、網(wǎng)上視頻點(diǎn)播特別適合采用多播方式。因?yàn)槿绻捎脝尾シ绞?,逐個(gè)節(jié)點(diǎn)傳輸,有多少個(gè)目標(biāo)節(jié)點(diǎn),就會(huì)有多少次傳送過程,這種方式顯然效率極低,是不可取的;如果采用不區(qū)分目標(biāo)、全部發(fā)送的廣播方式,雖然一次可以傳送完數(shù)據(jù),但是顯然達(dá)不到區(qū)分特定數(shù)據(jù)接收對(duì)象的目的。采用多播方式,既可以實(shí)謝謝閱讀,.現(xiàn)一次傳送所有目標(biāo)節(jié)點(diǎn)的數(shù)據(jù),也可以達(dá)到只對(duì)特定對(duì)象傳送數(shù)據(jù)的目的。謝謝閱讀廣播:“廣播”在網(wǎng)絡(luò)中的應(yīng)用較多,如客戶機(jī)通過DHCP自動(dòng)獲得IP地精品文檔放心下載址的過程就是通過廣播來(lái)實(shí)現(xiàn)的。但是同單播和多播相比,廣播幾乎占用了子網(wǎng)謝謝閱讀內(nèi)網(wǎng)絡(luò)的所有帶寬。四、系統(tǒng)功能描述及軟件模塊劃分該軟件能實(shí)現(xiàn)的功能:該軟件主要實(shí)現(xiàn)了局域網(wǎng)聊天功能。通過定義一個(gè)消息結(jié)構(gòu)體,把局域網(wǎng)通感謝閱讀信中必要的信息包含進(jìn)來(lái)便于操作。發(fā)送的消息包含了自己的IP地址和名稱,精品文檔放心下載以及類型,程序中有一個(gè)線程專門接收并處理各種不同的消息。在同一個(gè)局域網(wǎng)謝謝閱讀中運(yùn)行程序通過發(fā)送組播消息可以發(fā)現(xiàn)彼此,接收到對(duì)方的消息后就把對(duì)方加入感謝閱讀好友列表中。之后就可以選擇一個(gè)好友發(fā)送消息,或者群發(fā)消息。每個(gè)用戶上線感謝閱讀時(shí)都會(huì)廣播自己上線的消息,其他用戶收到后更新好友列表,把其IP和對(duì)應(yīng)的感謝閱讀用戶名添加到好友列表中;下線時(shí)廣播自己下線的消息,其他用戶把其IP和用謝謝閱讀戶名從好友列表中刪除。軟件的模塊包括:套接字管理模塊和主程序中的消息循環(huán)模塊。感謝閱讀五、設(shè)計(jì)步驟定義的一個(gè)消息類型和結(jié)構(gòu)為:enumSendType{LOAD,//上線REFRESH_SELF,//刷新NOTIFY_ONE_I_EXIST,//回應(yīng)消息表示自己存在感謝閱讀CHANGE_NAME,//修改名稱SEND_MSG_TO_ONE,//向某個(gè)特定IP發(fā)送消息謝謝閱讀SEND_MSG_TO_ALL,//廣播消息UNLOAD//下線};,.classMessageStruct{public:MessageStruct(){type=LOAD;msg_name[0]='\0';ip[0]='\0';dialog[0]='\0';}SendTypetype;精品文檔放心下載charmsg_name[32];charip[32];chardialog[8192];};套接字管理模塊的核心代碼如下:boolSocketManger::InitSocket(unsignedshortport)感謝閱讀{//初始化套接字m_socket=socket(AF_INET,SOCK_DGRAM,0);謝謝閱讀if(INVALID_SOCKET==m_socket)感謝閱讀{AfxMessageBox("Createsocketfailed!",MB_OK);精品文檔放心下載returnfalse;}SOCKADDR_INsocketSrv;socketSrv.sin_family=AF_INET;感謝閱讀socketSrv.sin_port=htons(port);謝謝閱讀socketSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);精品文檔放心下載if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&socketSrv,sizeof(SOCKADDR)))精品文檔放心下載{AfxMessageBox("Bindsocketfailed!");謝謝閱讀closesocket(m_socket);returnfalse;}returntrue;}boolSocketManger::JoinGroupCast(conststd::string&multiIp)謝謝閱讀{//加入組播組structip_mreqipmr;intlen=sizeof(ipmr);ipmr.imr_multiaddr.s_addr=inet_addr(multiIp.c_str());感謝閱讀ipmr.imr_interface.s_addr=htonl(INADDR_ANY);精品文檔放心下載setsockopt(m_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&ipmr,len);感謝閱讀returntrue;}消息循環(huán)的主要代碼如下:DWORDWINAPICChaChaChatDlg::RecvProc(LPVOIDlpParameter)謝謝閱讀,.{CChaChaChatDlg*pDlg=((ParameterToThread*)lpParameter)->pDlg;謝謝閱讀HWNDhwnd =((ParameterToThread*)lpParameter)->hwnd;謝謝閱讀SOCKADDR_INaddrFrom;intlen= sizeof(SOCKADDR);感謝閱讀MessageStruct*pMessage=newMessageStruct;精品文檔放心下載intreval;charnameTemp[32]={0};charip[32]={'\0'};charmsg[8192]={'\0'};charbuff[8300]={'\0'};CStringownIp;CStringreceivedIp=ip;while(true){reval=recvfrom(SocketManger::m_socket,(char*)pMessage,sizeof(MessageStruct),0,(SOCKADDR*)&add精品文檔放心下載rFrom,&len);if(SOCKET_ERROR==reval){break;}SendTypetype=pMessage->type;strncpy(nameTemp,pMessage->msg_name,sizeof(nameTemp)-1);strncpy(ip,pMessage->ip,sizeof(ip)-1);strncpy(msg,pMessage->dialog,sizeof(msg)-1);謝謝閱讀switch(type){caseLOAD:ownIp=pDlg->GetOwnIp();if(ip==ownIp)//上線通知自己不做處理謝謝閱讀{break;}pDlg->PushNameToMap(ip,nameTemp);謝謝閱讀pDlg->UpdateTheList();::PostMessage(hwnd,WM_RECVDATA_NOTIFY_EXIST,0,(LPARAM)&addrFrom);break;感謝閱讀caseREFRESH_SELF:ownIp=pDlg->GetOwnIp();if(ip==ownIp)//上線通知自己不做處理感謝閱讀{break;}::PostMessage(hwnd,WM_RECVDATA_ANSWER_REFRESH,0,(LPARAM)&addrFrom);break;感謝閱讀,.caseCHANGE_NAME:pDlg->ChangeNameFromMap(ip,nameTemp);精品文檔放心下載pDlg->UpdateTheList();break;caseNOTIFY_ONE_I_EXIST:pDlg->PushNameToMap(ip,nameTemp);謝謝閱讀pDlg->UpdateTheList();break;caseSEND_MSG_TO_ONE:sprintf(buff,"[%s對(duì)你說(shuō):]\r\n%s\n",nameTemp,msg);::PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff);break;謝謝閱讀caseSEND_MSG_TO_ALL:ownIp=pDlg->GetOwnIp();if(ip==ownIp)//上線通知自己不做處理謝謝閱讀{break;}sprintf(buff,"[%s對(duì)所有人說(shuō):]\r\n%s\n",nameTemp,msg);::PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff);break;感謝閱讀caseUNLOAD:pDlg->QuitNameFormMap(ip);謝謝閱讀pDlg->UpdateTheList();break;//quitmap->updatethelist精品文檔放心下載default:break;}}deletelpParameter;return0;}發(fā)送信息模塊:voidCChaChaChatDlg::OnBnClickedButtonSend()//sendto****謝謝閱讀{intval=m_toAll.GetCheck();精品文檔放心下載GetDlgItemText(IDC_EDIT_INPUT,m_msgInput);感謝閱讀charmsgBuff[8300]={'\0'};精品文檔放心下載MessageStruct*pMsgStruct=newMessageStruct;謝謝閱讀strcpy(pMsgStruct->msg_name,m_userName.GetBuffer(m_userName.GetLength()));感謝閱讀if(m_msgInput==""){AfxMessageBox("不要發(fā)送空信息!");謝謝閱讀return;}if(m_msgInput.GetLength()>8000)感謝閱讀,.{AfxMessageBox("字?jǐn)?shù)太多了,不要超過字!");謝謝閱讀return;}strcpy(pMsgStruct->dialog,m_msgInput.GetBuffer(m_msgInput.GetLength()));感謝閱讀SOCKADDR_INaddrTo;addrTo.sin_family=AF_INET;精品文檔放心下載addrTo.sin_port=htons(9876);感謝閱讀if(1==val)//組播{pMsgStruct->type=SEND_MSG_TO_ALL;strcpy(pMsgStruct->ip,m_ip.GetBuffer(m_ip.GetLength()));addrTo.sin_addr.S_un.S_addr=inet_addr("234.5.6.7");sprintf(msgBuff,"[你對(duì)大家說(shuō):]\r\n%s\n",pMsgStruct->dialog);OnRecvDataUpdateText(0,(LPARAM)msgBuff);精品文檔放心下載}elseif(0==val&&m_destIp!="")//單播感謝閱讀{pMsgStruct->type=SEND_MSG_TO_ONE;精品文檔放心下載addrTo.sin_addr.S_un.S_addr=inet_addr(m_destIp);//ip要加""嗎??sprintf(msgBuff,"[你對(duì)%s說(shuō):]\r\n%s\n",m_destName,pMsgStruct->dialog);OnRecvDataUpdateText(0,(LPARAM)msgBuff);感謝閱讀}else{deletepMsgStruct;AfxMessageBox("選擇一個(gè)聊天對(duì)象!");精品文檔放心下載return;}sendto(SocketManger::m_socket,(char*)pMsgStruct,sizeof(MessageStruct),0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));謝謝閱讀deletepMsgStruct;SetDlgItemText(IDC_EDIT_INPUT,"");謝謝閱讀}其他代碼:voidCChaChaChatDlg::UpdateTheList()謝謝閱讀{//更新好友列表m_listUsers.DeleteAllItems();謝謝閱讀for(friendIteriter=friendsMap.begin();iter!=friendsMap.end();++iter)謝謝閱讀{,.std::stringstrIp=(*iter).first;精品文檔放心下載std::stringstrName=(*iter).second;謝謝閱讀m_listUsers.InsertItem(0,strName.c_str());精品文檔放心下載m_listUsers.SetItemText(0,1,strIp.c_str());精品文檔放心下載}}voidCChaChaChatDlg::ChangeNameFromMap(std::stringstrIp,std::stringstrName)感謝閱讀{//修改列表中名稱friendIterwhere;where=friendsMap.find(strIp);謝謝閱讀std::stringoldName=(*where).second;精品文檔放心下載if(where==friendsMap.end())謝謝閱讀return;else{friendsMap.erase(where);感謝閱讀}friendsMap.insert(std::make_pair(strIp,strName));精品文檔放心下載//提示:std::stringnotice="上一動(dòng)作:["+oldName+"]將名字改為了["+strName+"]";SetDlgItemText(IDC_NOTICE,notice.c_str());感謝閱讀}voidCChaChaChatDlg::PushNameToMap(std::stringstrIp,std::stringstrName)精品文檔放心下載{//添加好友到列表friendsMap.insert(std::make_pair(strIp,strName));感謝閱讀std::stringnotice="上一動(dòng)作:["+strName+"]上線了!";精品文檔放心下載SetDlgItemText(IDC_NOTICE,notice.c_str());感謝閱讀}voidCChaChaChatDlg::QuitNameFormMap(std::stringstrIp)感謝閱讀{//從列表刪除好友friendIterwhere;where=friendsMap.find(strIp);感謝閱讀if(where==friendsMap.end())感謝閱讀return;else{std::stringnotice="上一動(dòng)作:["+where->second+"]下線了!";SetDlgItemText(IDC_NOTICE,notice.c_str());friendsMap.erase(where);感謝閱讀}}六、設(shè)計(jì)結(jié)果,.登錄界面如下:程序主界面如下:修改昵稱界面:,.本程序把整個(gè)局域網(wǎng)當(dāng)成一個(gè)聊天室,如果

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論