版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
關(guān)鍵源程序及其詳細的注釋<一〉、服務(wù)器端:1、Socket初始化〃初始化對話框BOOLCCSocketDlg::OnInitDialog(){count=0;m_list.InsertColumn(0,"消息”);m_list.SetColumnWidth(0,435);m_edit.SetLimitText(99);for(inti=0;i<50;i++)//初始化SOCKET數(shù)組msgsock=NULL;serv.sin_addr.s_addr=htonl(INADDR_ANY);設(shè)定地址serv.sin_family=AF_INET;serv.sin_port=5000;//htons(5000);addlen=sizeof(serv);m_button.EnableWindow(FALSE);sock=socket(AF_INET,SOCK_STREAM,0);創(chuàng)建socketif(bind(sock,(sockaddr*)&serv,addlen))綁定{m_edit.SetWindowText(綁定錯誤'');)elsem_edit.SetWindowText?務(wù)器創(chuàng)建成功);〃顯示提示信息,表示服務(wù)器創(chuàng)建成功listen(sock,5);/開始偵聽AfxBeginThread(&thread,0);/調(diào)用線程)returnTRUE;}2、接收線程〃服務(wù)器線程UINTthread(LPVOIDp){charbuff[100];/定義緩沖區(qū)CSizesize;size.cx=0;size.cy=30;ints=1,msgcount,loop=1,flag=0;CCSocketDlg*dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();獲得當(dāng)前運行對話框句柄msgcount=dlg->getcount();/獲取還沒有被占用的數(shù)組序號if(msgcount==-1)/如果不等于4,則表示,還有空缺SOCKETloop=0;if(loop){s=1;dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));//用空缺的SOCKET等待客戶連接if(dlg->msgsock[msgcount]==INVALID_SOCKET){dlg->m_edit.SetWindowText("Erroraccept");如/果返回錯誤,則提示錯誤}else{AfxBeginThread(thread,0);//果和客戶端連接成功,則再次啟動一個線程dlg->SetForegroundWindow();//示連機成功信息em(dlg->count++,連接成功');dlg->m_list.InsertItdlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));dlg->m_list.Scroll(size);dlg->m_button.EnableWindow(TRUE);while(s!=SOCKET_ERROR)/如果沒有發(fā)生錯誤,則一直循環(huán)等待數(shù)據(jù)的到來{s=recv(dlg->msgsock[msgcount],buff,100,0);循環(huán)接收數(shù)據(jù)dlg->SetForegroundWindow();if(s!=SOCKET_ERROR如果接收成功,則顯示接收到的數(shù)據(jù){dlg->m_list.InsertItem(dlg->count++,buff);dlg->m_list.Scroll(size);dlg->sendtoall(dlg->msgsock[msgcount],buff);發(fā)送信息到所有的客戶端))send(dlg->msgsock[msgcount],"Disconnected",100,0);j//果發(fā)生錯誤,發(fā)送連接中斷消息到客戶端dlg->m_list.InsertItem(dlg->count++,"Disconnected")顯示相關(guān)信息dlg->m_list.Scroll(size);dlg->msgsock[msgcount]=NULL;//該SOCKET設(shè)定為空for(inti=0;i<50;i++)/判斷是否還有其他客戶在保持連接if(dlg->msgsoclt=NULL)flag=1;if(flag!=1)//如果沒有客戶連接了,則將發(fā)送按鈕設(shè)置為不可用dlg->m_button.EnableWindow(FALSE);closesocket(dlg->msgsock[msgcount]);//關(guān)閉連接}}AfxEndThread(0);//終止線程return0;}3、數(shù)據(jù)發(fā)送當(dāng)用戶在文本框中輸入要發(fā)送的信息后,然后單擊“發(fā)送”按鈕,則執(zhí)行以下代碼?!òl(fā)送數(shù)據(jù)voidCCSocketDlg::OnButton1(){charbuff[100];m_edit.GetWindowText(buff,99);//獲得當(dāng)前文本框中的信息m_edit.SetWindowText("");//清空文本框的信息m_list.InsertItem(count++,buff);//向列表框中插入要發(fā)送的數(shù)據(jù)CSizesize;size.cx=0;size.cy=30;m_list.Scroll(size);for(inti=0;i<50;i++)//循環(huán)向所有客戶發(fā)送信息{if(msgsock!=NULL)send(msgsockbuff,100,0);}}<二>、客戶端1、連接服務(wù)器連接服務(wù)器的程序是在“連接”按扭的單擊事件中處理的?!ㄟB接服務(wù)器,連接按扭處理事件voidCCSocketcliDlg::OnButton2(){charipaddress[35];//定義標量以保存服務(wù)器地址m_edit2.GetWindowText(ipaddress,30);//獲得服務(wù)器地址cli.sin_addr.s_addr=inet_addr(ipaddress);//設(shè)定SOCKET需要連接的地址cli.sin_family=AF_INET;cli.sin_port=5000;//htons(5000);//設(shè)定服務(wù)器端口clisock=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建socketee=1;AfxBeginThread(thread,0);//啟動線程}2、接收數(shù)據(jù)線程當(dāng)用戶單擊“連接”按鈕以后,程序進行相關(guān)設(shè)定,最后調(diào)用了"AfxBeginThread(thread,0);”啟動了該線程。UINTthread(LPVOIDv){charbuff[100];chararray[25][30]=//定義數(shù)組用來存放一些IP地址{"192.168.0.3",…(這里省略了部分IP)"192.168.0.30"};CSizesize;size.cx=0;size.cy=30;ints=1,addcount=0;CCSocketcliDlg*dlg=(CCSocketcliDlg*)AfxGetApp()->GetMainWnd();//獲得對話框dlg->m_connect.EnableWindow(FALSE);dlg->m_disconnect.EnableWindow(TRUE);&&while(connect(dlg->clisock,(sockaddr*)&(dlg->cli),sizeof(dlg->cli))dlg->ee!=0)〃連接到服務(wù)器{dlg->m_edit.SetWindowText("等待");for(inti=0;i<=65000;i++)//空循環(huán)for(intj=0;j<=200;j++);if(addcount==25)addcount=0;dlg->cli.sin_addr.s_addr=inet_addr(array[addcount++]);//如果連接不成功,則連接下一個地址}&&if(dlg->ee==1)//如果連接成功,則顯示相關(guān)信息dlg->m_list.InsertItem(dlg->count++,"連接成功”);dlg->m_button1.EnableWindow(TRUE);//設(shè)定發(fā)送按鈕為可用狀態(tài)dlg->SetForegroundWindow();while(s!=SOCKET_ERROR&&dlg->ee!=0)//循環(huán)獲得數(shù)據(jù)s=recv(dlg->clisock,buff,100,0);〃調(diào)用recv函數(shù)接收數(shù)據(jù)dlg->SetForegroundWindow();if(s!=SOCKET_ERROR&&dlg->ee!=0)//如果沒有發(fā)生錯誤,同時沒有斷開連接,則顯示接收到的數(shù)據(jù)dlg->m_list.InsertItem(dlg->count++,buff);dlg->m_list.Scroll(size);}send(dlg->clisock,"Disconnected",100,0);//如果發(fā)生錯誤,發(fā)送斷開命令dlg->m_button1.EnableWindow(FALSE);//設(shè)定相關(guān)控件屬性dlg->m_connect.EnableWindow(TRUE);dlg->m_disconnect.EnableWindow(FALSE);closesocket(dlg->clisock);//關(guān)閉SOCKETAfxEndThread(0);//終止該線程return0;}3、數(shù)據(jù)發(fā)送數(shù)據(jù)發(fā)送就是客戶端向服務(wù)器及其他客戶端發(fā)送信息,其中向其他用戶發(fā)送信息是通過服務(wù)器實現(xiàn)的,因此,客戶只需要將消息發(fā)送到服務(wù)器就可以了?!ㄓ脩魡螕舭l(fā)送按扭,發(fā)送信息voidCCSocketcliDlg::OnButton1(){charbuff[100];CSizesize;size.cx=0;size.cy=30;m_edit.GetWindowText(buff,99);〃獲得發(fā)送信息m_edit.SetWindowText("");m_list.InsertItem(count++,buff);m_list.Scroll(size);send(clisock,buff,100,0);〃發(fā)送數(shù)據(jù)}五、執(zhí)行結(jié)果及其分析。1、開啟服務(wù)器端聊天程序。消息?土工.■?二圖一:創(chuàng)建服務(wù)器端(提示:服務(wù)器創(chuàng)建成功)
服務(wù)器端創(chuàng)建成功,并自動綁定了服務(wù)器的IP。等待客戶端的連接請求,此時的發(fā)送按扭是不可用的,當(dāng)有客戶端連接上時發(fā)送按扭就變?yōu)榭捎谩T谙旅娴木庉嬁蚶镙斎胄畔⒕涂梢园l(fā)送了。圖二:有客戶端連接成功(IP地址為服務(wù)器地址)-1n|x|圖三:服務(wù)器端發(fā)送“你好”并接受“客戶端回復(fù)”兩條信息-1n|x|圖三:服務(wù)器端發(fā)送“你好”并接受“客戶端回復(fù)”兩條信息TCP■天務(wù)器希程序:消息連接成荀~10.90.1.11你好?客尸端回復(fù)圖四:有客戶端斷開連接(提示:Disconnected)2、客戶端程序運行。客戶端程序中輸入服務(wù)器端所在的ip,然后點連接,如果成
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年主管護師考試真題試題及答案
- 護士十四項制度試題及答案2025版
- 2025年全國工業(yè)機器人競賽題庫及答案
- 2025年司機年度工作總結(jié)例文
- 新員工入職三級安全教育題庫試卷含答案
- 2026校招:重慶股權(quán)服務(wù)集團試題及答案
- 2026 年離婚協(xié)議書正規(guī)模板標準化
- 統(tǒng)編版(2024)七年級下冊語文教學(xué)工作計劃
- 調(diào)料公司生產(chǎn)部年終總結(jié)(3篇)
- 領(lǐng)導(dǎo)學(xué)(專升本)地質(zhì)大學(xué)期末開卷考試題庫及答案
- 光纖激光打標機說明書
- 勞動者個人職業(yè)健康監(jiān)護檔案
- 《兩角和與差的正弦、余弦、正切公式》示范公開課教學(xué)PPT課件【高中數(shù)學(xué)人教版】
- 治理現(xiàn)代化下的高校合同管理
- 境外宗教滲透與云南邊疆民族地區(qū)意識形態(tài)安全研究
- GB/T 28920-2012教學(xué)實驗用危險固體、液體的使用與保管
- GB/T 26389-2011衡器產(chǎn)品型號編制方法
- GB/T 16588-2009帶傳動工業(yè)用多楔帶與帶輪PH、PJ、PK、PL和PM型:尺寸
- 人大企業(yè)經(jīng)濟學(xué)考研真題-802經(jīng)濟學(xué)綜合歷年真題重點
- 建筑抗震鑒定標準課件
- 人教版二年級數(shù)學(xué)下冊《【全冊】完整版》優(yōu)質(zhì)課件
評論
0/150
提交評論