生活随笔
收集整理的這篇文章主要介紹了
基于WSAAsyncSelect模型实现的聊天室图形客户端
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
對(duì)應(yīng)的Linux服務(wù)器為:http://blog.csdn.net/microtong/archive/2009/12/12/4989902.aspx
?
?
頭文件ClientDlg.h
[cpp]?view plaincopy
?? ?? #pragma?once?? #include?"afxcmn.h"?? #include?"afxwin.h"?? #define?WM_NETWORK?WM_USER+100?? ?? class?CClientDlg?:?public?CDialog?? {?? ?? public:?? ????CClientDlg(CWnd*?pParent?=?NULL);????? ?? ????enum?{?IDD?=?IDD_CLIENT_DIALOG?};?? ????protected:?? ????virtual?void?DoDataExchange(CDataExchange*?pDX);?????? ?? ?? protected:?? ????HICON?m_hIcon;?? ?????? ????virtual?BOOL?OnInitDialog();?? ????afx_msg?void?OnSysCommand(UINT?nID,?LPARAM?lParam);?? ????afx_msg?void?OnPaint();?? ????afx_msg?HCURSOR?OnQueryDragIcon();?? ????DECLARE_MESSAGE_MAP()?? public:?? ????CIPAddressCtrl?m_ip;?? ????int?m_port;?? ????CEdit?m_allmsg;?? ????CString?m_nickname;?? ????CString?m_message;?? ????afx_msg?void?OnBnClickedConnect();?? ?????? ????SOCKET?sock;?? ????struct?sockaddr_in?serverAddr;?? ????CString?msg;?? ????LRESULT?OnNetwork(WPARAM?wParam,?LPARAM?lParam);?? ????void?OnConnect(SOCKET?s);?? ????void?OnRead(SOCKET?s);?? ????void?OnCloseSocket(SOCKET?s);?? ????afx_msg?void?OnBnClickedSend();?? ????afx_msg?void?OnBnClickedDisconnect();?? ????afx_msg?void?OnClose();?? ????afx_msg?void?OnBnClickedQuit();?? ????afx_msg?void?OnBnClickedChangeName();?? };??
?
對(duì)話(huà)框源文件 ClientDlg.cpp
?
[cpp]?view plaincopy
?? ?? #include?"stdafx.h"?? #include?"Client.h"?? #include?"ClientDlg.h"?? #ifdef?_DEBUG?? #define?new?DEBUG_NEW?? #endif?? ?? ?? class?CAboutDlg?:?public?CDialog?? {?? public:?? ????CAboutDlg();?? ?? ????enum?{?IDD?=?IDD_ABOUTBOX?};?? ????protected:?? ????virtual?void?DoDataExchange(CDataExchange*?pDX);?????? ?? protected:?? ????DECLARE_MESSAGE_MAP()?? };?? CAboutDlg::CAboutDlg()?:?CDialog(CAboutDlg::IDD)?? {?? }?? void?CAboutDlg::DoDataExchange(CDataExchange*?pDX)?? {?? ????CDialog::DoDataExchange(pDX);?? }?? BEGIN_MESSAGE_MAP(CAboutDlg,?CDialog)?? END_MESSAGE_MAP()?? ?? ?? ?? ?? CClientDlg::CClientDlg(CWnd*?pParent?)?? ????:?CDialog(CClientDlg::IDD,?pParent)?? ????,?m_port(8000)?? ????,?m_nickname(_T("microtong"))?? ????,?m_message(_T("hello"))?? {?? ????m_hIcon?=?AfxGetApp()->LoadIcon(IDR_MAINFRAME);?? }?? void?CClientDlg::DoDataExchange(CDataExchange*?pDX)?? {?? ????CDialog::DoDataExchange(pDX);?? ????DDX_Control(pDX,?IDC_IP,?m_ip);?? ????DDX_Text(pDX,?IDC_PORT,?m_port);?? ????DDX_Control(pDX,?IDC_ALLMESSAGE,?m_allmsg);?? ????DDX_Text(pDX,?IDC_NICKNAME,?m_nickname);?? ????DDV_MaxChars(pDX,?m_nickname,?30);?? ????DDX_Text(pDX,?IDC_MESSAGE,?m_message);?? ????DDV_MaxChars(pDX,?m_message,?1024);?? }?? BEGIN_MESSAGE_MAP(CClientDlg,?CDialog)?? ????ON_WM_SYSCOMMAND()?? ????ON_WM_PAINT()?? ????ON_WM_QUERYDRAGICON()?? ?????? ????ON_BN_CLICKED(IDC_CONNECT,?&CClientDlg::OnBnClickedConnect)?? ????ON_BN_CLICKED(IDC_SEND,?&CClientDlg::OnBnClickedSend)?? ????ON_BN_CLICKED(IDC_DISCONNECT,?&CClientDlg::OnBnClickedDisconnect)?? ????ON_WM_CLOSE()?? ????ON_BN_CLICKED(IDC_QUIT,?&CClientDlg::OnBnClickedQuit)?? ????ON_BN_CLICKED(IDC_CHANGENAME,?&CClientDlg::OnBnClickedChangeName)?? ????ON_MESSAGE(WM_NETWORK,&CClientDlg::OnNetwork)?? END_MESSAGE_MAP()?? ?? ?? BOOL?CClientDlg::OnInitDialog()?? {?? ????CDialog::OnInitDialog();?? ?????? ?????? ????ASSERT((IDM_ABOUTBOX?&?0xFFF0)?==?IDM_ABOUTBOX);?? ????ASSERT(IDM_ABOUTBOX?<?0xF000);?? ????CMenu*?pSysMenu?=?GetSystemMenu(FALSE);?? ????if?(pSysMenu?!=?NULL)?? ????{?? ????????CString?strAboutMenu;?? ????????strAboutMenu.LoadString(IDS_ABOUTBOX);?? ????????if?(!strAboutMenu.IsEmpty())?? ????????{?? ????????????pSysMenu->AppendMenu(MF_SEPARATOR);?? ????????????pSysMenu->AppendMenu(MF_STRING,?IDM_ABOUTBOX,?strAboutMenu);?? ????????}?? ????}?? ?????? ?????? ????SetIcon(m_hIcon,?TRUE);??????????? ????SetIcon(m_hIcon,?FALSE);?????????? ?????? ?????? ????m_ip.SetAddress(127,0,0,1);?? ????return?TRUE;???? }?? void?CClientDlg::OnSysCommand(UINT?nID,?LPARAM?lParam)?? {?? ????if?((nID?&?0xFFF0)?==?IDM_ABOUTBOX)?? ????{?? ????????CAboutDlg?dlgAbout;?? ????????dlgAbout.DoModal();?? ????}?? ????else?? ????{?? ????????CDialog::OnSysCommand(nID,?lParam);?? ????}?? }?? ?? ?? ?? void?CClientDlg::OnPaint()?? {?? ????if?(IsIconic())?? ????{?? ????????CPaintDC?dc(this);??? ????????SendMessage(WM_ICONERASEBKGND,?reinterpret_cast<WPARAM>(dc.GetSafeHdc()),?0);?? ?????????? ????????int?cxIcon?=?GetSystemMetrics(SM_CXICON);?? ????????int?cyIcon?=?GetSystemMetrics(SM_CYICON);?? ????????CRect?rect;?? ????????GetClientRect(&rect);?? ????????int?x?=?(rect.Width()?-?cxIcon?+?1)?/?2;?? ????????int?y?=?(rect.Height()?-?cyIcon?+?1)?/?2;?? ?????????? ????????dc.DrawIcon(x,?y,?m_hIcon);?? ????}?? ????else?? ????{?? ????????CDialog::OnPaint();?? ????}?? }?? ?? ?? HCURSOR?CClientDlg::OnQueryDragIcon()?? {?? ????return?static_cast<HCURSOR>(m_hIcon);?? }?? ?? void?CClientDlg::OnBnClickedConnect()?? {?? ????UpdateData(TRUE);?? ????DWORD?ip;?? ????m_ip.GetAddress(ip);?? ?????? ????WSADATA?wsa;?? ????if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){?? ????????MessageBox("套接字初始化失敗!");?? ????????return;?? ????}?? ?????? ????if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){?? ????????MessageBox("創(chuàng)建套接字失敗!");?? ????????WSACleanup();?? ????????return;?? ????}?? ?????ZeroMemory(&serverAddr,sizeof(serverAddr));?? ?????serverAddr.sin_family?=?AF_INET;????? ?????serverAddr.sin_addr.S_un.S_addr?=?htonl(ip);?? ?????serverAddr.sin_port?=?htons(m_port);?? ??????? ?????if(WSAAsyncSelect(sock,?m_hWnd,?WM_NETWORK,?FD_CONNECT?|?FD_READ?|?FD_CLOSE)==SOCKET_ERROR){?? ?????????MessageBox("注冊(cè)網(wǎng)絡(luò)事件失敗!");?? ?????????closesocket(sock);?? ?????????WSACleanup();?? ?????}?? ?????msg.Format("Connecting?to?%s:%d/n",inet_ntoa(serverAddr.sin_addr),?ntohs(serverAddr.sin_port));?? ?????m_allmsg.SetSel(32767,32767);?? ?????m_allmsg.ReplaceSel(msg);?? ?????if(connect(sock,?(struct?sockaddr*)&serverAddr,?sizeof(serverAddr))==SOCKET_ERROR){?? ?????????int?err?=?WSAGetLastError();?? ?????????if(err==WSAEWOULDBLOCK){?? ?????????????msg.Format("Waiting....../n");?? ?????????????m_allmsg.SetSel(32767,32767);?? ?????????????m_allmsg.ReplaceSel(msg);?? ?????????}else{?? ?????????????MessageBox("無(wú)法連接到服務(wù)器!");?? ??????????????closesocket(sock);?? ?????????????WSACleanup();?? ?????????}?? ?????}?? ?????GetDlgItem(IDC_DISCONNECT)->EnableWindow(TRUE);?? ?????GetDlgItem(IDC_SEND)->EnableWindow(TRUE);?? ?????GetDlgItem(IDC_CHANGENAME)->EnableWindow(TRUE);?? ?????GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);?? ?????GetDlgItem(IDC_IP)->EnableWindow(FALSE);?? ?????GetDlgItem(IDC_PORT)->EnableWindow(FALSE);?? ?? }?? LRESULT?CClientDlg::OnNetwork(WPARAM?wParam,?LPARAM?lParam)?? {?? ????SOCKET?s?=?(SOCKET)wParam;?? ????WORD?netEvent?=?WSAGETSELECTEVENT(lParam);?? ????WORD?error?=?WSAGETSELECTERROR(lParam);?? ????if(error!=0){?? ????????msg.Format("Error?code:?%d/n",error);?? ????????m_allmsg.SetSel(32767,32767);?? ????????m_allmsg.ReplaceSel(msg);?? ????????if(error==WSAECONNREFUSED){?? ????????????msg.Format("Connection?refused./n");?? ????????????m_allmsg.SetSel(32767,32767);?? ????????????m_allmsg.ReplaceSel(msg);?? ????????????closesocket(sock);?? ????????????WSACleanup();?? ????????????GetDlgItem(IDC_DISCONNECT)->EnableWindow(FALSE);?? ????????????GetDlgItem(IDC_SEND)->EnableWindow(FALSE);?? ????????????GetDlgItem(IDC_CHANGENAME)->EnableWindow(FALSE);?? ????????????GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);?? ????????????GetDlgItem(IDC_IP)->EnableWindow(TRUE);?? ????????????GetDlgItem(IDC_PORT)->EnableWindow(TRUE);?? ????????}?? ????????return?-1;?? ????}?? ????switch(netEvent){?? ????????case?FD_CONNECT:?? ????????????OnConnect(s);?? ????????????break;?? ????????case?FD_READ:?? ????????????OnRead(s);?? ????????????break;?? ????????case?FD_CLOSE:?? ????????????OnCloseSocket(s);?? ????????????break;?? ????}?? ????return?0;?? }?? void?CClientDlg::OnConnect(SOCKET?s)?? {?? ????msg.Format("Connected?to?%s:%d/n",inet_ntoa(serverAddr.sin_addr),ntohs(serverAddr.sin_port));?? ????m_allmsg.SetSel(32767,32767);?? ????m_allmsg.ReplaceSel(msg);?? }?? void?CClientDlg::OnRead(SOCKET?s)?? {?? ????static?char?buf[4096];?? ????int?bytes;?? ????bytes?=?recv(s,?buf,?sizeof(buf),?0);?? ????if(bytes==SOCKET_ERROR?||?bytes==0){?? ????????msg.Format("Socket?error?%d/n",WSAGetLastError());?? ????????m_allmsg.SetSel(32767,32767);?? ????????m_allmsg.ReplaceSel(msg);?? ????????closesocket(s);?? ????????return;?? ????}?? ????buf[bytes]?=?'/0';?? ????m_allmsg.SetSel(32767,32767);?? ????m_allmsg.ReplaceSel(buf);?? ????m_allmsg.SetSel(32767,32767);?? ????m_allmsg.ReplaceSel("/n");?? }?? void?CClientDlg::OnCloseSocket(SOCKET?s)?? {?? ????closesocket(s);?? ????msg?=?"Connection?closed./n?";?? ????m_allmsg.SetSel(32767,32767);?? ????m_allmsg.ReplaceSel(msg);?? ????GetDlgItem(IDC_DISCONNECT)->EnableWindow(FALSE);?? ????GetDlgItem(IDC_SEND)->EnableWindow(FALSE);?? ????GetDlgItem(IDC_CHANGENAME)->EnableWindow(FALSE);?? ????GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);?? ????GetDlgItem(IDC_IP)->EnableWindow(TRUE);?? ????GetDlgItem(IDC_PORT)->EnableWindow(TRUE);?? ????WSACleanup();?? }?? void?CClientDlg::OnBnClickedSend()?? {?? ????UpdateData(TRUE);?? ????int?bytes;?? ????bytes?=?send(sock,(const?char*)m_message,m_message.GetLength(),0);?? ????if(bytes==SOCKET_ERROR){?? ????????int?error?=?WSAGetLastError();?? ????????if(error==WSAEWOULDBLOCK){?? ????????????msg?=?"Send?failed?for?message:?";?? ????????????msg+=m_message;?? ????????}else{?? ????????????msg.Format("Connection?is?down.");?? ????????}?? ????????m_allmsg.SetSel(32767,32767);?? ????????m_allmsg.ReplaceSel(msg);?? ????}?? }?? void?CClientDlg::OnBnClickedDisconnect()?? {?? ????shutdown(sock,SD_SEND);?? }?? void?CClientDlg::OnClose()?? {?? ?????? ????closesocket(sock);?? ????WSACleanup();?? ????CDialog::OnClose();?? }?? void?CClientDlg::OnBnClickedQuit()?? {?? ????SendMessage(WM_CLOSE);?? }?? void?CClientDlg::OnBnClickedChangeName()?? {?? ????UpdateData(TRUE);?? ????char?buf[100];?? ????sprintf(buf,"name?%s",m_nickname);?? ????if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){?? ????????MessageBox("發(fā)送改名命令失敗!");?? ????????return;?? ????}?? ?????? } ?
基于WSAAsyncSelect模型實(shí)現(xiàn)的聊天室圖形客戶(hù)端
總結(jié)
以上是生活随笔為你收集整理的基于WSAAsyncSelect模型实现的聊天室图形客户端的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。