这两天照着教学视频用C++做了个小的聊天室程序,只是实现接收端和发送端进行简单的数据传递。主要分一下几个步骤:

1、打开vc++建立一个MFC AppWizard(exe)的工程我的工程名为Caht紧接着选择一个“基本对话框”将其里面的三个空间都删去。添加一个组框并改其标题为”接受数据“,在组框中添加一个差不多大小的编辑框,改其ID为IDC_EDIT_RECV。接着在刚才那个组框下面在添加一个组框并将其标题改为”发送数据“再这个组框中添加一个IP地址空间和一个编辑框并将编辑框的ID改为”IDC_EDIT_SEND“。再在这个组框的下面添加一个按钮修改其ID为”IDC_BTN_SEND“标题为”发送“。

2、这是一个基于SOCKET的程序,首先要在CChatApp的IniteInsastance文件中初始加载套接字代码如下:BOOL CChatApp::InitInstance()
{
 if(!AfxSocketInit())
 {
     AfxMessageBox("加载套接字库失败");
  return FALSE;
 }。。。。。

其中AfxSocketInit()函数返回一个布尔值。要想使用这个函数还需要在预编译头文件StdAfx中加入#include”Afxsock.h“

3、紧接着我们在CChatDlg中通过右键分别添加一个成员函数InitSocket和一个成员变量m_socket(设为private)在函数InitSocket()中添加如下代码:BOOL CChatDlg::InitSocket()
{
    m_socket=socket(AF_INET,SOCK_DGRAM,0);
 if(INVALID_SOCKET==m_socket)
 {
     MessageBox("套接字创建失败");
  return FALSE;
 } 此段代码用于创建初始化套接字。紧接着写如下代码:

SOCKADDR_IN addrSock;
 addrSock.sin_family=AF_INET;
 addrSock.sin_port=htons(6000);
 addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
   
 int retval;
 retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
 if(retval==SOCKET_ERROR)
 {
   closesocket(m_socket);
   MessageBox("绑定失败");
   return FALSE;
 }
 return TRUE;
}此段代码用于绑定。并在OnInitDialog()中添加声明InitSocket()。代码如下:InitSocket();

4、接下来该接受数据啦,我们创建一个线程专门用来接受数据,并将接受到的数据显示在编辑框中。我应该使用线程创建函数CreateThread()。线程的任务是接受到数据并将其显示因此需要两个参数,注意到CreateThread()函数的第四个参数为结构体指针,因此构造一个结构体,用此结构体传递这两个参数。在CChatDlg()中添加一个结构体构造代码如下:struct RECVPARAM
{
  SOCKET socket;
  HWND hwnd;
};最后这个双引号注意不要丢掉。接着在OnInitDialog()声明并引用这个结构体代码如下:RECVPARAM *pRecvParam=new RECVPARAM;
 pRecvParam->socket=m_socket;
 pRecvParam->hwnd=m_hWnd;//m_hWnd是每个窗体对应的句柄。

接着在CreateThread()用这个结构体当参数。代码如下:

HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
 CloseHandle(hThread);
 return TRUE;  // return TRUE  unless you set the focus to a control
}上面的这个函数CreateThread()的第三个参数是对应的是这个线程的功能函数RecvProc(要不将此函数声明为静态的要不将其在全局声明)。在下面对此函数具体实现编码如下:

DWORD WINAPI CChatDlg::RecvProc(LPVOID IpParameter)
{
 SOCKET socket=((RECVPARAM*)IpParameter)->socket;
 HWND hwnd=((RECVPARAM*)IpParameter)->hwnd;

SOCKADDR_IN addrFrom;
 int len=sizeof(SOCKADDR);

char recvBuf[200];
 char tempBuf[300];
 int retval;
 while(TRUE)
 {
   retval=recvfrom(socket,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
   if(SOCKET_ERROR==retval)
    break;
   sprintf(tempBuf,"%s 说 %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
      
   ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
 }将接受过来的数据通过消息响应使其显示到响应的编辑框中。编辑代码步骤如下:

a:在CChatDlg中定义如下:#define WM_RECVDATA WM_USER+1

b:在下面相应的地方接着写:afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);

c:在DoDataExchange(CDataExchange *pDx)中写入如下代码:

BEGIN_MESSAGE_MAP(CChatDlg, CDialog)
 //{{AFX_MSG_MAP(CChatDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)
 //}}AFX_MSG_MAP
ON_MESSAGE(WM_RECVDATA,OnRecvData)
END_MESSAGE_MAP()

d:

void CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
  CString str=(char*)lParam;
  CString strTemp;

GetDlgItemText(IDC_EDIT_RECV,strTemp);
  str+="/r/n";
  str+=strTemp;
  SetDlgItemText(IDC_EDIT_RECV,str);
}以上四部是一个消息的过程。

以上的接受端基本已经写好了接下来该写发送端啦。

5、双击发送按钮自动生成一个void CChatDlg::OnBtnSend()函数其中的代码如下:

void CChatDlg::OnBtnSend()
{
 // TODO: Add your control notification handler code here
 DWORD dvIp;
 ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dvIp);

SOCKADDR_IN AddrTo;
 AddrTo.sin_family=AF_INET;
 AddrTo.sin_port=htons(6000);
 AddrTo.sin_addr.S_un.S_addr=htonl(dvIp);

CString strSend;
 GetDlgItemText(IDC_EDIT_SEND,strSend);
 sendto(m_socket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&AddrTo,sizeof(SOCKADDR));

SetDlgItemText(IDC_EDIT_SEND,"");
 
}

以上就是实现的整个过程。

我应该对如下的一些函数记住:socket()、bind()函数中具体参数的含义、句柄handle和hwnd具体含义、CreatThread()函数以及参数的具体含义还有其参数中的功能函数、sprintf()函数、afx_msg定义标识符的意义、recvfrom()函数及参数、inet_ntoa()函数功能:将网络地址转换成“.”点隔的字符串格式。postMessage()函数:、MV_USER所以自定义消息的步骤:(一)先在头文件中定义自己消息的ID,如 #define WM_MY_FIRST_MESSAGE (WM_USER + 0x001)   (二)再声明自己的消息处理函数:afx_msg void OnMyFirstMessage();   (三)在CPP文件中添加消息映射宏: (四)最后定义消息处理函数:

对做的一个小的C++聊天室的总结相关推荐

  1. 突发灵感,看到某网站的搞笑图片挺多,做了一个小java,扫描抠了一些

    2019独角兽企业重金招聘Python工程师标准>>> 突发灵感,看到某网站的搞笑图片挺多,做了一个小java,扫描抠了一些 这里分享一下 /*** 取得文件的后缀名* @Descr ...

  2. 黑白块游戏java代码_用java做的一个小游戏—黑白反斗棋(适合菜鸟)

    用Java做的一个小游戏,黑白反斗棋,我玩过了5*5和10*10的.是学习之后做的,不是自己原始开发的. import java.awt.Color; import java.awt.FlowLayo ...

  3. 七夕给女朋友做的一个小礼物

    今天正值七夕佳节,想着给女朋友表白,就做了一个小demo,很简单很简单,界面只显示一颗爱心,但是简短的代码里有着我自己想表达的情意 let nowadays, future, dueTime,some ...

  4. 做了一个小项目-PHP实现人生只有900个月

    做了一个小项目-PHP实现人生只有900个月 ​ 起因当然是阮一峰老师那篇振聋发聩的博文<人生只有900个月>,几年前看到以后羞愧到无法自拔,想到自己曾经浪费多少时间,在一些无意义的事情上 ...

  5. 使用socket.io做一个简单的WEB聊天室

    使用socket.io做一个简单的WEB聊天室(可消息私发) 1. 创建一个空的工程目录 空的目录命名为chat-web 2. 创建package.json 使用命令:npm init,会引导你设置p ...

  6. 微信小程序websocket聊天室

    背景 最近做了一个微信小程序的即时通讯功能,之前我也做过node.js的websocket服务,不过是在web端应用的socket.io服务.小程序本身对http.websocket等连接均有诸多限制 ...

  7. 实现一个简单的语音聊天室(源码)

    语音聊天室,或多人语音聊天,是即时通信应用中常见的功能之一,比如,QQ的语音讨论组就是我们用得比较多的. 这篇文章将实现一个简单的语音聊天室,让多个人可以进入同一个房间进行语音沟通.先看运行效果截图: ...

  8. 实现一个简单的视频聊天室(源码)

    在 <实现一个简单的语音聊天室>一文发布后,很多朋友建议我也实现一个视频聊天室给他们参考一下,其实,视频聊天室与语音聊天室的原理是差不多的,由于加入了摄像头.视频的处理,逻辑会繁杂一些,本 ...

  9. 实现一个简单的语音聊天室(多人语音聊天系统)

    多人语音聊天,或语音聊天室,是即时通信应用中常见的功能之一,比如,QQ的语音讨论组就是我们用得比较多的. 本文将基于最新版本的OMCS(V3.5)实现一个简单的语音聊天室,让多个人可以进入同一个房间进 ...

  10. 如何简单的创建一个多人在线聊天室

    学习目标: 在本教程中,我们将要使用PHP和jQuery创建一个简单的在线聊天工具. 这种实用性的模块对于你想要有实时在线客户支持系统的网站可以说是完美. 废话不多说直接开始. 步骤1:HTML的代码 ...

最新文章

  1. python repl_asyncio REPL(Python 3.8)
  2. java web Junit
  3. 【学术相关】近5年十大最具影响力的 AI 论文,你知道几个?
  4. MySQL的一些概念笔记
  5. 大疆口袋相机美颜怎么设置_灵眸Osmo口袋云台相机评测-大疆灵眸云相机使用说明...
  6. VMWare vijava –“用户名或密码不正确”异常的奇怪情况
  7. python 第四天
  8. 【从零开始学习SLAM】扫地机器人工作原理 传感器原理 结构 工作流程 路径规划技术
  9. 阿铭Linux_网站维护学习笔记20190416
  10. python文本文件加密_Python 文本加密解密 中文TXT数据
  11. 计算机网络原理(3)数据编码技术
  12. STM32 DS18B20温度传感器实验(HAL库)
  13. 洛谷P1548 [NOIP1997 普及组] 棋盘问题
  14. c语言line函数编写画六边形,canvas 画六边形
  15. 几款主流数据库的详细比较
  16. 瀑布流的3种实现方式
  17. word常见问题_2 添加不同的页码
  18. 大写锁定怎么解除(笔记本大写锁定怎么解除)
  19. MySQL(入门篇18)SQLyog 的用户权限管理 ; SQL语句的用户权限管理。
  20. #Sora#peewee plus celery = ?

热门文章

  1. 想批量转换音频?来试试这几个会议录音转文字软件
  2. 红帽考试环境之RHCSA
  3. ab plc编程软件计算机语言,AB plc-Rslogix5000 software 软件编程实例.pdf
  4. 2019五一建模A题思路
  5. python爬虫之cookie和session介绍——以12306验证码破解和浏览车次为例
  6. 产品经理应该懂得的一点技术
  7. 黑马程序员pink老师_CSS学习笔记
  8. win7美化_Win10桌面美化实用软件推荐
  9. matlab如何看算法时间,【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序...
  10. 郑州大学python考试题库_GitHub - 2512500960/zzu-minieap: 适用于郑州大学的minieap,锐捷认证客户端,用于linux(包括openwrt)平台,...