用WSAsyncSelect創(chuàng)建一個(gè)聊天室實(shí)驗(yàn)過(guò)程_第1頁(yè)
用WSAsyncSelect創(chuàng)建一個(gè)聊天室實(shí)驗(yàn)過(guò)程_第2頁(yè)
用WSAsyncSelect創(chuàng)建一個(gè)聊天室實(shí)驗(yàn)過(guò)程_第3頁(yè)
用WSAsyncSelect創(chuàng)建一個(gè)聊天室實(shí)驗(yàn)過(guò)程_第4頁(yè)
用WSAsyncSelect創(chuàng)建一個(gè)聊天室實(shí)驗(yàn)過(guò)程_第5頁(yè)
已閱讀5頁(yè),還剩3頁(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)介

1、用WSAsyncSelect創(chuàng)建一個(gè)聊天室服務(wù)器端程序1.創(chuàng)建基于對(duì)話框的MFC應(yīng)用程序,巹 添加一個(gè)EDIT控件,界面效果如圖示。在xxxDlg.cpp中引入Socket動(dòng)態(tài)鏈接庫(kù),并定義Socket消息 /引y入?Socket動(dòng)態(tài)?連?接庫(kù)a #include winsock2.h#pragma comment(lib,WS2_32.lib)/定義?Socket消?息 #define WM_SOCKET (WM_USER+1)在應(yīng)用程序胡初始化部分初始化Socket。在 :OnInitDialog() 中添加初始化代碼。/初始化SocketWSADATA wsaData;WORD sock

2、etVersion=MAKEWORD(2,2);if(WSAStartup(socketVersion,&wsaData)!=0)MessageBox(LSOCKET初始化失敗!);return 0;USHORT nPort=3000;SOCKET s=socket(AF_INET,SOCK_STREAM,0);sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=ntohs(nPort);sin.sin_addr.S_un.S_addr=INADDR_ANY;if(bind(s,(sockaddr*)&sin,sizeof(sin)=SOCK

3、ET_ERROR)DWORD error=GetLastError();return TRUE;/注冊(cè)Socket關(guān)心的事件WSAAsyncSelect(s,m_hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);listen(s,10);編寫(xiě)Socket的消息響應(yīng)函數(shù)在xxxDlg.h文件中添加Socket消息響應(yīng)函數(shù)afx_msg LRESULT OnSocketMsg(WPARAM wParam,LPARAM lParam);在xxxDlg.cpp實(shí)現(xiàn)消息響應(yīng)函數(shù)LRESULT CASynsIODlg:OnSocketMsg(WPARAM wParam,LPARAM l

4、Param)SOCKET s=wParam;CString strContent;if(WSAGETSELECTERROR(lParam)closesocket(s);return false;switch(WSAGETSELECTEVENT(lParam)case FD_ACCEPT: /檢測(cè)到有套接字連接SOCKET client=accept(s,NULL,NULL);WSAAsyncSelect(client,m_hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);CString strContent;GetDlgItemText(IDC_EDIT1,s

5、trContent);if(!strContent.IsEmpty()strContent+=rn;strContent+=有客戶端連接上來(lái)了!;SetDlgItemText(IDC_EDIT1,strContent);/顯示內(nèi)容break;case FD_WRITE:break;case FD_READ:char szText1024=0;if(recv(s,szText,1024,0)=-1)closesocket(s);elseGetDlgItemText(IDC_EDIT1,strContent);if(!strContent.IsEmpty() strContent+=rn; CSt

6、ring strTemp;strTemp.Format(-T(%s),szText);strContent+=strTemp;SetDlgItemText(IDC_EDIT1,strContent);/顯示內(nèi)容break;case FD_CLOSE:closesocket(s);GetDlgItemText(IDC_EDIT1,strContent);if(!strContent.IsEmpty()strContent+=rn;strContent+=有客戶斷開(kāi)連接了!;SetDlgItemText(IDC_EDIT1,strContent);/顯示內(nèi)容break;return true;定義

7、WM_SOCKET帶OnOnSocketMsg()函數(shù)的映射關(guān)系。BEGIN_MESSAGE_MAP(CWSAsyncSelectDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CWSAsyncSelectDlg:OnBnClickedOk)/定義WM_SOCKET消息到OnSocketMsg()函數(shù)胡映射ON_MESSAGE(WM_SOCKET,OnSocketMsg)END_MESSAGE_MAP()在窗口銷(xiāo)毀事件中釋放Socket資源??蛻舳顺绦蛑谱饕弧?chuàng)建MF

8、C應(yīng)用程序并布局控件,其界面如下:二、初始化“IP地址“及”端口號(hào)“控件的值。三、添加全局變量在XXXDlg.h文件中添加#define WM_NETWORK WM_USER+100 SOCKET sock; 四、編寫(xiě)“連接”按鈕響應(yīng)事件函數(shù)/初始化Socket WSADATA wsa; if(WSAStartup(MAKEWORD(2,2),&wsa)!=0) MessageBox(L套接字初始化失敗!); return; /創(chuàng)建Socket if(sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)=INVALID_SOCKET) MessageBox(

9、L創(chuàng)建套接字失??!); WSACleanup(); return; /獲取服務(wù)器地址及端口號(hào) CString strip; GetDlgItemText(IDC_IPADDRESS1,strip); const char *cip; cip=(const char *)strip.GetBuffer(strip.GetLength(); CString strPort; GetDlgItemText(IDC_EDIT2,strPort); int port=_ttoi(strPort);/ msg.Format(%c,&cip);MessageBox(msg+ +strPort);/綁定地址

10、struct sockaddr_in serverAddr; ZeroMemory(&serverAddr,sizeof(serverAddr); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.S_un.S_addr = inet_addr(127.0.0.1); serverAddr.sin_port = htons(3000); /注冊(cè)SOcket關(guān)注的事件/請(qǐng)求諒鏈接 if(connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)=SOCKET_ERROR)

11、int err = WSAGetLastError(); if(err=WSAEWOULDBLOCK) msg.Format(_T(Waiting./n); else MessageBox(_T(無(wú)法連接到服務(wù)器!); closesocket(sock); WSACleanup(); 五、編寫(xiě)“發(fā)送”按鈕響應(yīng)事件函數(shù) / TODO: 在此添加控件通知處理程序代碼/讀取庶發(fā)送的數(shù)據(jù)CString m_message;GetDlgItemText(IDC_EDIT3,m_message);/發(fā)送數(shù)據(jù) int bytes = send(sock,(const char *)m_message.GetBuffer(m_message.GetLength(),m_message.GetLength()*2,0); if(bytes=SOCKET_ERROR) int error = WSAGetLastError(); if(error=WSAEWOULDBLOCK) msg = Send failed for message: ; msg+=m_message; else msg.Format(

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論