实验室系统:Windows10

实验室IDE:VS2012

一、创建MFC文件项目。

文件->新建->项目

然后根据图片进行操作

注意的地方:

1.取消union库

2.勾选上Windows套接字,让系统自动帮我们生成

3.选择Dlog

二、添加控件

点开工具箱

建立两个主框,一个用来接收数据,一个用来发送数据

再在主框里面建立3个edit,一个用来显示发送来的数据,一个用来显示自己发送的数据,下面那个用来显示要发送的数据

最后删掉原有,并加一个按钮为发送,添加一个ip控制

三、编写代码

1.加载套接字数据库

先手到我们的cpp中,因为我们之前选择了Windows套接字库,所以会给我们生成好

我们也可以让系统提示我们是否加载失败


CWinApp::InitInstance();  //去加载套接字库,需要包含一个Afxsock.h的头文件,就不需要去链接套接字库if (!AfxSocketInit()){AfxMessageBox("Load socket"); //利用AfxMessageBox弹出提示return FALSE;}


接着我们去查看是包含了头文件


看到这个说明没有问题

然后我们去头文件中去定义。

然后我们去写初始化的函数体


BOOL CSorgsDlg::InitSocket(){  //套接字本身的初始化//指定地址族,类型(给予UDT的数据包套接字),0(系统自己选择合适的协议)msocket = socket(AF_INET,SOCK_DGRAM,0);//msocket:私有权限的套接字描述符if (INVALID_SOCKET == msocket) //判断套接字是否创建失败{MessageBox("create socket false");return FALSE;}//作为接收端,需要绑定端口和地址上SOCKADDR_IN acceptSock; //定义地址结构体的变量acceptSock.sin_family = AF_INET;  //地址族acceptSock.sin_port = htons(6000);//设定端口 用htons转换acceptSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //接受发送到本地任何IP地址的数据 htonl转换//进行绑定int retval = 0; //定义整理变量用来判断bind(msocket,(SOCKADDR *)&acceptSock,sizeof(SOCKADDR));if (SOCKET_ERROR == retval){closesocket(msocket); //关闭套接字MessageBox("bind false");return FALSE;}return TRUE;
}

写完了我们的函数,我们需要去设置加载它的地方。

在这个函数中去调用我么的初始化套接字函数


BOOL CSorgsChatDlg::OnInitDialog()

现在开始接收端的程序,为解决CreateThread中的LPVOID只能传递一个参数值的问题,我们首先去头文件穿件一个一个结构体

//定义结构体,解决CreateThread中的LPVOID只能传递一个参数值的问题
struct RECVPARAM
{SOCKET sock;//定义一个套接字类型的变量HWND hwnd;//定义一个窗口类型的变量
};

接下来去定义套接字的指针和串口句柄(现在刚刚调用初始化套接字函数的下面)

 RECVPARAM *mRecvParam = new RECVPARAM; //定义一个指针mRecvParam->sock = msocket; //初始化我们创建的套接字mRecvParam->hwnd = m_hWnd; //初始化我们窗口 mhWnd里面保存了和这个类相关的窗口的句柄//调用CteateThread常见线程//NULL,0:和调用线程使用一样的大小,线程函数的地址,(强转)参数,创建的标记(一旦创建立即运行),线程IDHANDLE mThread = CreateThread(NULL,0,Threadpro,(LPVOID)mRecvParam,0,NULL);CloseHandle(mThread); //将线程句柄关闭 同时递减线程类和对象的使用基数


为了使用完全使用面向对象的方式,我们去头文件进行定义


 //当创建线程的时候。运行时代码需要去调用这个线程函数从而启动线程//而我们为了不设置为全局函数设置为CSorgsChatDlg类的成员函数(完全面向对象的思想编程)//而要想调用这个成员函数,必须去定义一个CSorgsChatDlg的对象//对于运行时代码来说,并不知道要定义那个对象或者说不知道怎么去定义//所以我们就像这个成员函数设置为静态static DWORD WINAPI Threadpro(LPVOID mlpvpid); //定义为静态,不属于那一个对象,只属于这个类本身

然后开始编写Threadpro函数体

DWORD WINAPI CSorgsDlg::Threadpro(LPVOID mlpvpid){//取出传递的来年两个参数值SOCKET sock = ((RECVPARAM*)mlpvpid)->sock;HWND hwnd = ((RECVPARAM*)mlpvpid)->hwnd;delete mlpvpid; //释放掉内存//发送数据SOCKADDR_IN fromSock;//定义套接字地址结构的变量,用来接收发送端的地址信息int len = sizeof(SOCKADDR);//用来接收返回的地址结构的长度char acceptBuf[200];//定义字符数组用来接收数据char tempBuf[300];//定义字符数组用来存放格式化后的数据int retval;while (true) //不断去接收数据{retval= recvfrom(sock,acceptBuf,200,0,(SOCKADDR*)&fromSock,&len); //套接字,接收的数据,接收数据长度,标志,地址结构体的指针if (SOCKET_ERROR == retval){break; //出错跳出循环}else //把数据传给对话框{sprintf_s(tempBuf,"%s说: %s",inet_ntoa(fromSock.sin_addr),recvBuf);//格式化.inet_ntoa()转化为点分十进制字符串::PostMessage(hwnd,M_RECVDATA,0,(LPARAM)tempBuf);//数据传给对话框}}return 0;
}

很明显发发现M_RECVDATA地方报错,接下来我们就处理这个问题

定义消息的值,在头文件里面写

然后就是去编写发送消息的函数

先去我们的MFC界面双击发送按钮,生成点击事件按钮

并右键属性,去知道我们的显示发送和显示接收数据的ID号

void CSorgsDlg::OnBnClickedButton1()
{DWORD dwIP;((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);//IP控件的IDSOCKADDR_IN ToSock;//定义地址结构体变量ToSock.sin_family = AF_INET;  //地址族ToSock.sin_port = htons(6000);//设定端口 用htons转换ToSock.sin_addr.S_un.S_addr= htonl(dwIP);CString strSend;GetDlgItemText(IDC_EDIT4,strSend);//发送框里面ID,获取里面的内容//套接字,发送的buffer,长度(多发送一个字节),标记,地址结构体的指针,地址结构体的长度sendto(msocket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&ToSock,sizeof(SOCKADDR));//发送SetDlgItemText(IDC_EDIT4,"");//发送之后将发送框的内容置空//显示自己发送框的数据设置CString strto;GetDlgItemText(IDC_EDIT3,strto);//获取文本,ID号,存放数据的地方strto +="\r\n"; //增加换行strto +="帅帅的自己说:";strto += strSend;SetDlgItemText(IDC_EDIT3,strto);//将数据放回编辑框
}

然后我们在去编写消息响应函数

在头文件中写入函数声明

然后去编写消息映射

然后去写函数体

//消息响应函数
//LRESULT,32位整形数,常常用于回调函数
LRESULT CSorgsDlg::MRecvData(WPARAM wParam,LPARAM lParam){CString str = (char*)lParam;CString strTemp;//接收久的数据 GetDlgItemText(IDC_EDIT2,strTemp);//获取显示发送框ID号,存放数据的地方str += "\r\n"; //增加换行str +=strTemp;SetDlgItemText(IDC_EDIT2,str);//将数据放回编辑框return TRUE;
}

自此,我们代码编写完毕

四、优化控件

1.是显示框分行

右键属性把Multiline设置为true

2.按钮回车发送和不显示按钮

右键按钮属性

五、测试

这里我们使用127.0.0.1回环地址进行测试

这样就说明没有问题了

Windows网络编程-简单的多线程聊天室相关推荐

  1. 06 java GUI 网络编程:图形界面聊天室

    仿照第4篇笔记的形式,笔者决定将GUI和网络编程部分用综合练习的方式来总结.练习项目是有图形界面的聊天室,用到了GUI中的javax.swing包和网络编程中的TCP/socket编程.GUI部分的难 ...

  2. 网络编程基础_5.3聊天室-多人聊天室

    聊天室-多人聊天室 #include <stdio.h>// 1. 包含必要的头文件和库, 必须位于 windows之前 #include <WinSock2.h> #prag ...

  3. Qt学习心得之网络编程简单的局域网聊天服务端建立

    学而不思则罔,思而不学则殆.学习和思考是相辅相成的,通过这几天对网络编程的学习,收获颇丰.接下来我将利用Qt做的一个以TcpIp协议为传输方式的简单的局域网聊天服务端与大家分享下: 首先谈谈我个人对T ...

  4. linux网络编程TCP多人聊天室

    用socket实现一个多人聊天室的思路很简单,即在服务器端定义一个fd的int型数组,用来存储已经连接的客户端的socket连接套接字fd(因为发送和接收数据都只需要借助连接套接字fd),当服务器接收 ...

  5. 网络编程项目—— 多人聊天室->双人聊天

    一.Coding前的思考和步骤梳理 1. 又开始思考这个问题,拿到一个需求,是调用java底层的代码写1000行实现,还是直接调第三方库写50行实现? 都一样. 发现第一次写shell的时候其实思考过 ...

  6. 【第98题】JAVA高级技术-网络编程17(简易聊天室12:实现客户端一对一聊天)

    回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 四.推荐专栏 五.示例源码下载 零.前言 ​ 今天是学习 JAVA ...

  7. 【第99题】JAVA高级技术-网络编程18(简易聊天室13:聊天室服务端)

    回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 四.推荐专栏 五.示例源码下载 零.前言 ​ 今天是学习 JAVA ...

  8. 【第90题】JAVA高级技术-网络编程9(简易聊天室4:获得Socket)

    回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 四.推荐专栏 五.示例源码下载 零.前言 ​ 今天是学习 JAVA语言 打卡的第9 ...

  9. 【第91题】JAVA高级技术-网络编程10(简易聊天室5:接收和发送Socket)

    回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 四.推荐专栏 五.示例源码下载 零.前言 ​ 今天是学习 JAVA语言 打卡的第9 ...

最新文章

  1. IntelliJ IDEA出现:This file is indented with tabs instead of 4 spaces的问题解决
  2. 让服务器apache/iis/nginx支持.apk/ipa文件下载
  3. BeagleBone Black项目实训手册(大学霸内部资料)
  4. 数据分析如何从1进阶到10?
  5. r语言主成分分析_PCA主成分分析
  6. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)
  7. Xen的起源与工作原理
  8. 工作107:静态路由
  9. java工程转maven工程_Java工程转换为Maven工程
  10. javascript的数据检测总结
  11. Codeforces Round #186 (Div. 2) Problem D 动态规划
  12. 复选框与文字无法对齐问题
  13. 第95天:CSS3 边框、背景和文字效果
  14. 5 Openstack-Ussuri-Placement部署-ubuntu1804
  15. VS2008安装Mercurial插件
  16. 实验6 - 家中的电视
  17. logo设计软件哪个好用?小白也能学会的logo设计小技巧
  18. 谷歌浏览器选择已保存的账号密码,输入框变色
  19. transporter上传卡正在交付_Xcode11或Transporter上传app store 一直卡在Authenticating with the App Store 的解决...
  20. 如何用低成本方案解决室内超大场景下机器人定位与导航难题?

热门文章

  1. 网页视频下载(TS流下载合成)
  2. Arch Linux多系统安装安装记录和蓝牙、fcitx5输入法-win\deepin\arch
  3. 【韵律预测】基于BILSTM-CRF的韵律预测
  4. 防火墙技术原理学习笔记
  5. 纯键盘操作电脑,无鼠标操作
  6. 嵌入式学习视频--配套硬件说明
  7. continue 语句
  8. 【JokerのZYNQ7020】AXI_EMC。
  9. Arduino通过I2C控制1602LCD显示屏
  10. Vue3.2中的setup语法糖