日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于WSAAsyncSelect模型实现的聊天室图形客户端

發(fā)布時(shí)間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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
  • //?ClientDlg.h?:?頭文件??
  • //??
  • #pragma?once??
  • #include?"afxcmn.h"??
  • #include?"afxwin.h"??
  • #define?WM_NETWORK?WM_USER+100??
  • //?CClientDlg?對(duì)話(huà)框??
  • class?CClientDlg?:?public?CDialog??
  • {??
  • //?構(gòu)造??
  • public:??
  • ????CClientDlg(CWnd*?pParent?=?NULL);???//?標(biāo)準(zhǔn)構(gòu)造函數(shù)??
  • //?對(duì)話(huà)框數(shù)據(jù)??
  • ????enum?{?IDD?=?IDD_CLIENT_DIALOG?};??
  • ????protected:??
  • ????virtual?void?DoDataExchange(CDataExchange*?pDX);????//?DDX/DDV?支持??
  • ??
  • //?實(shí)現(xiàn)??
  • protected:??
  • ????HICON?m_hIcon;??
  • ????//?生成的消息映射函數(shù)??
  • ????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();??
  • ????//?服務(wù)器套接字??
  • ????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
  • //?ClientDlg.cpp?:?實(shí)現(xiàn)文件??
  • //??
  • #include?"stdafx.h"??
  • #include?"Client.h"??
  • #include?"ClientDlg.h"??
  • #ifdef?_DEBUG??
  • #define?new?DEBUG_NEW??
  • #endif??
  • ??
  • //?用于應(yīng)用程序“關(guān)于”菜單項(xiàng)的?CAboutDlg?對(duì)話(huà)框??
  • class?CAboutDlg?:?public?CDialog??
  • {??
  • public:??
  • ????CAboutDlg();??
  • //?對(duì)話(huà)框數(shù)據(jù)??
  • ????enum?{?IDD?=?IDD_ABOUTBOX?};??
  • ????protected:??
  • ????virtual?void?DoDataExchange(CDataExchange*?pDX);????//?DDX/DDV?支持??
  • //?實(shí)現(xiàn)??
  • 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?對(duì)話(huà)框??
  • ??
  • ??
  • CClientDlg::CClientDlg(CWnd*?pParent?/*=NULL*/)??
  • ????:?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()??
  • ????//}}AFX_MSG_MAP??
  • ????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()??
  • ??
  • //?CClientDlg?消息處理程序??
  • BOOL?CClientDlg::OnInitDialog()??
  • {??
  • ????CDialog::OnInitDialog();??
  • ????//?將“關(guān)于...”菜單項(xiàng)添加到系統(tǒng)菜單中。??
  • ????//?IDM_ABOUTBOX?必須在系統(tǒng)命令范圍內(nèi)。??
  • ????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);??
  • ????????}??
  • ????}??
  • ????//?設(shè)置此對(duì)話(huà)框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對(duì)話(huà)框時(shí),框架將自動(dòng)??
  • ????//??執(zhí)行此操作??
  • ????SetIcon(m_hIcon,?TRUE);?????????//?設(shè)置大圖標(biāo)??
  • ????SetIcon(m_hIcon,?FALSE);????????//?設(shè)置小圖標(biāo)??
  • ????//?TODO:?在此添加額外的初始化代碼??
  • ????//為測(cè)試方便IP地址初始化為本機(jī)IP地址??
  • ????m_ip.SetAddress(127,0,0,1);??
  • ????return?TRUE;??//?除非將焦點(diǎn)設(shè)置到控件,否則返回?TRUE??
  • }??
  • void?CClientDlg::OnSysCommand(UINT?nID,?LPARAM?lParam)??
  • {??
  • ????if?((nID?&?0xFFF0)?==?IDM_ABOUTBOX)??
  • ????{??
  • ????????CAboutDlg?dlgAbout;??
  • ????????dlgAbout.DoModal();??
  • ????}??
  • ????else??
  • ????{??
  • ????????CDialog::OnSysCommand(nID,?lParam);??
  • ????}??
  • }??
  • //?如果向?qū)υ?huà)框添加最小化按鈕,則需要下面的代碼??
  • //??來(lái)繪制該圖標(biāo)。對(duì)于使用文檔/視圖模型的?MFC?應(yīng)用程序,??
  • //??這將由框架自動(dòng)完成。??
  • void?CClientDlg::OnPaint()??
  • {??
  • ????if?(IsIconic())??
  • ????{??
  • ????????CPaintDC?dc(this);?//?用于繪制的設(shè)備上下文??
  • ????????SendMessage(WM_ICONERASEBKGND,?reinterpret_cast<WPARAM>(dc.GetSafeHdc()),?0);??
  • ????????//?使圖標(biāo)在工作矩形中居中??
  • ????????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;??
  • ????????//?繪制圖標(biāo)??
  • ????????dc.DrawIcon(x,?y,?m_hIcon);??
  • ????}??
  • ????else??
  • ????{??
  • ????????CDialog::OnPaint();??
  • ????}??
  • }??
  • //當(dāng)用戶(hù)拖動(dòng)最小化窗口時(shí)系統(tǒng)調(diào)用此函數(shù)取得光標(biāo)顯示。??
  • //??
  • HCURSOR?CClientDlg::OnQueryDragIcon()??
  • {??
  • ????return?static_cast<HCURSOR>(m_hIcon);??
  • }??
  • ??
  • void?CClientDlg::OnBnClickedConnect()??
  • {??
  • ????UpdateData(TRUE);??
  • ????DWORD?ip;??
  • ????m_ip.GetAddress(ip);??
  • ????//初始化套接字DLL??
  • ????WSADATA?wsa;??
  • ????if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){??
  • ????????MessageBox("套接字初始化失敗!");??
  • ????????return;??
  • ????}??
  • ????//創(chuàng)建套接字??
  • ????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);??
  • ?????//注冊(cè)感興趣的網(wǎng)絡(luò)事件??
  • ?????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()??
  • {??
  • ????//MessageBox("close");??
  • ????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ò),歡迎將生活随笔推薦給好友。