当前位置: 首页 > news >正文

MFC网络编程-Udp客户端

目录

1、UI的设计:

2、代码的实现:

(1)、重写CSocket虚函数OnReceive,并且传入对话框的指针

(2)、初始化SOCKET

(3)、绑定本地IP和端口

(4)、显示本地IP和端口在界面

(5)、进入房间事件

(6)、离开房间事件

(7)、发送信息事件

(8)、接收到数据的处理函数ProcessPendingRead

(9)、优化处理

1)、初始化默认服务端的端口和IP在框架的入口函数

2)、没有加入房间,发送按钮和退出按钮都不能点击

3)、初始化发送消息的EDIT只读,服务端IP和PORT可以修改

4)、加入房间之后重新设置按钮的状态

5)、离开房间重新设置按钮的状态

6)、重写框架类的关闭窗口函数,实现关闭窗口之后调用离开房间按钮事件。

3、最终的UI:


1、UI的设计:

2、代码的实现:

首先自定义一个类继承与CSocket类

(1)、重写CSocket虚函数OnReceive,并且传入对话框的指针

声明对话框类

class CUdpClientDlg;

传递指针

CClientSocket(CUdpClientDlg * pdlg);

CUdpClientDlg *m_pMainDlg;

CClientSocket::CClientSocket(CUdpClientDlg * pdlg)
{
    m_pMainDlg = pdlg;
}

重写OnReceive函数实现底层的通信,并且自定义一个处理函数ProcessPendingRead

void CClientSocket::OnReceive(int nErrorCode)
{
    // TODO: 在此添加专用代码和/或调用基类

    
    CSocket::OnReceive(nErrorCode);
    m_pMainDlg->ProcessPendingRead();
}
 

(2)、初始化SOCKET

//初始化SOCKET
    m_pClientSocket = new CClientSocket(this);
    m_pClientSocket->Create(0, SOCK_DGRAM);//使用数据报类型

(3)、绑定本地IP和端口

//绑定了本地IP和端口
    CString strIP;
    UINT uiPort;

    m_pClientSocket->GetSockName(strIP, uiPort);

(4)、显示本地IP和端口在界面


    SetDlgItemText(IDC_EDIT_LOAD_IP, strIP);
    SetDlgItemInt(IDC_EDIT_LOAD_PORT, uiPort);

(5)、进入房间事件

获取服务端IP和端口

CString strIp;
    UINT uiPort;
    GetDlgItemTextW(IDC_EDIT_SERVER_IP, strIp);
    uiPort = GetDlgItemInt(IDC_EDIT_SERVER_PORT);

进入房间发送enter


    CString strEnterMsg("enter");
    int nSead = m_pClientSocket->SendTo(strEnterMsg, strEnterMsg.GetLength() + 100, uiPort, strIp);
    if (nSead == SOCKET_ERROR)
    {
        MessageBox(L"进入聊天室失败!");
        return;
    }

设置标志位

//设置标志位
    m_EnterRoom = true;

(6)、离开房间事件

首先获取服务端IP和地址

CString strIp;
    UINT uiPort;
    GetDlgItemTextW(IDC_EDIT_SERVER_IP, strIp);
    uiPort = GetDlgItemInt(IDC_EDIT_SERVER_PORT);

离开房间发送leave

CString strEnterMsg("leave");
    int nSead = m_pClientSocket->SendTo(strEnterMsg, strEnterMsg.GetLength() + 100, uiPort, strIp);
    if (nSead == SOCKET_ERROR)
    {
        MessageBox(L"离开聊天室失败!");
        return;
    }

设置标志位

m_bEnterRoom = true;

(7)、发送信息事件

获取服务端的地址

//获取服务端的地址
    CString strIp;
    UINT uiPort;
    GetDlgItemTextW(IDC_EDIT_SERVER_IP, strIp);
    uiPort = GetDlgItemInt(IDC_EDIT_SERVER_PORT);

发送数据

//发送数据
    CString strMsg;
    GetDlgItemText(IDC_EDIT_SEND_MESSAGE, strMsg);
    m_pClientSocket->SendTo(strMsg, strMsg.GetLength() + 100, uiPort, strIp);

清空发送文本框


    //清空
    SetDlgItemText(IDC_EDIT_SEND_MESSAGE, L"");

(8)、接收到数据的处理函数ProcessPendingRead

CHAR buffer[4096];

    int nRead = m_pClientSocket->ReceiveFrom(buffer, 4096,NULL,NULL);
    if (nRead == SOCKET_ERROR)
    {
        return;
    }
    buffer[nRead] = L'\0';//字符串\0结尾所以要加上
    CString strMsg(buffer);
    CString alMsg;

    GetDlgItemText(IDC_EDIT_CHAT_MESSAGE, alMsg);
    SetDlgItemText(IDC_EDIT_CHAT_MESSAGE, alMsg + L"\r\n" + strMsg);

(9)、优化处理

1)、初始化默认服务端的端口和IP在框架的入口函数

//设置服务端默认的端口和IP
    SetDlgItemText(IDC_EDIT_SERVER_IP, L"127.0.0.1");
    SetDlgItemText(IDC_EDIT_SERVER_PORT, L"8080");

2)、没有加入房间,发送按钮和退出按钮都不能点击

//设置按钮初始化状态
    GetDlgItem(IDC_BUTTON_OUT)->EnableWindow(FALSE);
    GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);

3)、初始化发送消息的EDIT只读,服务端IP和PORT可以修改

GetDlgItem(IDC_EDIT_SEND_MESSAGE)->EnableWindow(FALSE);
    GetDlgItem(IDC_EDIT_SERVER_IP)->EnableWindow(TRUE);
    GetDlgItem(IDC_EDIT_SERVER_PORT)->EnableWindow(TRUE);

4)、加入房间之后重新设置按钮的状态

//设置按钮文本框的状态
    //设置按钮初始化状态
    GetDlgItem(IDC_BUTTON_OUT)->EnableWindow(TRUE);
    GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(TRUE);

    ((CEdit*)GetDlgItem(IDC_EDIT_SEND_MESSAGE))->SetReadOnly(FALSE);
    ((CEdit*)GetDlgItem(IDC_EDIT_SERVER_IP))->SetReadOnly(TRUE);
    ((CEdit*)GetDlgItem(IDC_EDIT_SERVER_PORT))->SetReadOnly(TRUE);

5)、离开房间重新设置按钮的状态

GetDlgItem(IDC_BUTTON_OUT)->EnableWindow(FALSE);
    GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);

    ((CEdit*)GetDlgItem(IDC_EDIT_SEND_MESSAGE))->SetReadOnly(TRUE);
    ((CEdit*)GetDlgItem(IDC_EDIT_SERVER_IP))->SetReadOnly(FALSE);
    ((CEdit*)GetDlgItem(IDC_EDIT_SERVER_PORT))->SetReadOnly(FALSE);

6)、重写框架类的关闭窗口函数,实现关闭窗口之后调用离开房间按钮事件。


BOOL CUdpClientDlg::DestroyWindow()
{
    // TODO: 在此添加专用代码和/或调用基类
    if (m_bEnterRoom)
    {
        OnBnClickedButtonOut();
    }

    return CDialogEx::DestroyWindow();
}

 

3、最终的UI:

实现UDP连接服务端

相关文章:

MFC网络编程-Udp客户端

目录 1、UI的设计: 2、代码的实现: (1)、重写CSocket虚函数OnReceive,并且传入对话框的指针 (2)、初始化SOCKET (3)、绑定本地IP和端口 (4)、…...

密码学基础

密码学总览 信息安全面临的危险与应对这些威胁的密码技术: 关于上图中的威胁,这里在简单的说明: 窃听:指的是需要保密的消息被第三方获取。篡改:指的是消息的内容被第三方修改,达到欺骗的效果。伪装&…...

[Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb

一.部署nodejs项目,映射端口,挂载数据卷 可以到https://hub.docker.com/去搜索node镜像,然后下载,也可以直接通过docker pull node下载镜像,然后用这个node镜像启动容器node,这样系统就集成了node服务了,在这里挂载www/node目录到容器中,并指定端口映射,运行nodejs程序,安装npm…...

拥抱AI-ChatGPT:人类新纪元

最近大模型通用智能应用持续发酵,各大科技公司都陆续推出了基于通用大模型的智能应用产品,典型的如OpenAI的ChatGPT、微软的BingChat、百度的文心一言、360的智脑、阿里的通义千问等。当然最火的要属于ChatGPT了,从去年年底推出到现在已经有很…...

基于深度学习的人脸表情识别 计算机竞赛

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸表情识别 该项目较…...

GitHub经常打不开或者访问解决办法

访问慢或无法访问的原因:DNS解析是最为基础的一个环节。由于Github的服务器在全球各地,域名解析所需的时间也会不同,这就导致了在特定地区可能会出现Github无法正常访问的情况。 解决:查询到github对应的IP,然后在host…...

密码学 - SHA-2

实验八 SHA-2 1.实验目的 熟悉SHA – 2算法的运行过程,能够使用C语言编写实现SHA-2算法程序,增加对摘要函数的理解。 2、实验任务 (1)理解SHA-2轮函数的定义和常量的定义。 (2)利用VC语言实现SHA-2算…...

Vins-Fusion、Vins-Mono(之前那个编译通过但是没有这个好用)

ROS的catkin_make不要修改,暂时没有理由,理由就是两次一个改了一个没改,没改的成功了以成功为准。 另外docker也没用成功,原本的逻辑来说,docker肯定不能出问题的,但是由于roscore通信的原因可能没有将结果显示&#x…...

每日自动化提交git

目前这个功能,有个前提: 这个git代码仓库,是一个人负责,所以不存在冲突问题 我这个仓库地址下载后的本地路径是:D:\Projects\Tasks 然后我在另外一个地方新建了一个bat文件: bat文件所在目录为&#xff1a…...

【Linux进程】再谈软件—操作系统(Operator System)

目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。 笼统的理解,操作系统…...

创建超过1G内存大小的程序

正常情况一个进程最大占用内存为1G一下&#xff0c;如果程序有需求要使用超过1G大小的程序&#xff0c;可进行如下操作 VS修改设置&#xff1a;属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…...

如何本地部署Jellyfin影音服务器并实现在公网访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…...

docker fixuid

docker fixuid 一、fixuid是什么二、使用场景三、问题dockerfiledocker run 一、fixuid是什么 fixuid是用go语言编写的&#xff0c;当容器起来后可以修改容器中非root用户的UID/GID和文件权限。 项目地址&#xff1a;https://github.com/boxboat/fixuid 二、使用场景 当容器…...

MySQL笔记--SQL语句

目录 1--SQL的通用语法 2--SQL语句的分类 3--DDL语句 3-1--数据库操作 3-2--表操作 3-3--数据类型 3-4--修改和删除 4--DML语句 4-1--插入数据 4-2--修改数据 4-3--删除数据 5--DQL语句 5-1--基本查询 5-2--条件查询 5-3--聚合函数 5-4--分组查询 5-5--排序查…...

线扫相机DALSA-相机平场矫正详细步骤

在相机视野下铺放白色亚克力板或纯白纸&#xff0c;采集图像。打开曲线图。 选择 Line Profile 模式。调节好相应所需的曝光时间、光源、增益和镜头光圈&#xff0c;让白平衡纸显示出来的灰度值大概在 150-200 左右。 在Calibration Algorithm 中将显示的数值设置好。 先暗场…...

求购供应发布农业副业产品市场行情小程序开发

农业副业产品求购供应发布市场行情小程序H5开源版开发 后台同步&#xff1a;一键获取全国近200家农产品批发市场的商品价格&#xff0c;包括蔬菜、水果、水产、粮油和农副产品等。 实时更新和同步市场价格动态&#xff0c;保障信息的准确性和时效性。 前端VIP权益功能&…...

框架安全-CVE 复现SpringStrutsLaravelThinkPHP漏洞复现

目录 服务攻防-框架安全&CVE 复现&Spring&Struts&Laravel&ThinkPHP概述PHP-开发框架安全-Thinkphp&Laravel漏洞复现Thinkphp-3.X RCEThinkphp-5.X RCELaravel框架安全问题- CVE-2021-3129 RCE JAVAWEB-开发框架安全-Spring&Struts2Struts2框架安全…...

【腾讯云 HAI域探秘】宝妈也能快速入门AI绘画

活动背景 本次活动是由腾讯云和CSDN联合推出的开发者技术实践活动。我通过技术交流直播、动手实验、征文等形式&#xff0c;深入沉浸式体验腾讯云高性能应用服务 HAI。从活动中汲取到技术上的精华。在本次活动中&#xff0c;只要完成各个环节任务&#xff0c;不仅可以参与 AIGC…...

归并排序,自顶向下

归并排序主要两步&#xff0c;一步是划分区间&#xff0c;另一步是合并两个区间 这个算法的稳定性更好&#xff0c;对比快排这种&#xff0c;如果整体是倒序的话&#xff0c;快排的复杂度会达到o(n^2)&#xff0c;归并会更稳定。 划分区间主要是递归去实现&#xff0c;下面给…...

【案例】3D地球(vue+three.js)

需要下载插件 <template><div class"demo"><div id"container" ref"content"></div></div> </template> <script> import * as THREE from three; // import mapJSON from ../map.json; import { Or…...

别再只用SSH了!给CentOS 7.9服务器装上图形桌面,用VNC远程操作真香

解锁CentOS 7.9图形化运维&#xff1a;VNC远程桌面实战指南在Linux服务器管理的日常工作中&#xff0c;纯命令行操作虽然高效&#xff0c;但遇到复杂的文件管理、图形化工具调试或团队协作时&#xff0c;图形界面往往能事半功倍。本文将带您从零开始&#xff0c;为CentOS 7.9服…...

从零开始手搓一个xv6内核页表:跟着6.S081源码一步步理解walk和mappages函数

从零构建xv6内核页表&#xff1a;深入解析walk与mappages的RISC-V实现在操作系统的核心机制中&#xff0c;虚拟内存管理始终是最具挑战性的部分之一。当我们打开MIT 6.S081课程的实验手册&#xff0c;面对"实现一个简化版页表"的任务时&#xff0c;许多学习者会陷入理…...

June安全防护手册:保护你的论坛免受常见Web攻击的10个技巧

June安全防护手册&#xff1a;保护你的论坛免受常见Web攻击的10个技巧 【免费下载链接】june June is a forum (Deprecated) 项目地址: https://gitcode.com/gh_mirrors/ju/june 在当今数字时代&#xff0c;论坛安全防护已成为每个网站管理员必须面对的重要课题。June作…...

Unity Addressable本地HTTP托管实战:5分钟跑通远程加载

1. 为什么Addressable本地托管总卡在“5分钟”这个幻觉里&#xff1f;Unity Addressable Asset System&#xff08;可寻址资源系统&#xff09;上线这么多年&#xff0c;我见过太多团队在“本地HTTP服务器”这一步摔得最狠——不是不会写代码&#xff0c;而是根本没搞清Address…...

Windows上安装APK文件的终极指南:告别臃肿模拟器,轻松实现跨平台应用安装

Windows上安装APK文件的终极指南&#xff1a;告别臃肿模拟器&#xff0c;轻松实现跨平台应用安装 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你知道吗&#xff1f;…...

ChatGPT生成内容同质化困局破局术:用故事化表达重构人机协作范式(仅限首批200位读者获取的叙事权重矩阵)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;叙事权重矩阵的底层逻辑与人机协作范式跃迁 叙事权重矩阵并非传统意义上的数值张量&#xff0c;而是一种动态语义映射结构&#xff0c;它将人类叙事意图、上下文可信度、模型生成置信度及跨模态对齐信号统一编…...

如何免费解锁Wand专业版功能:Wand-Enhancer完整使用指南

如何免费解锁Wand专业版功能&#xff1a;Wand-Enhancer完整使用指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为Wand&#xff08;原WeMod&…...

DeepSeek免费额度到底能跑几个大模型?揭秘2024最新配额规则与5个隐藏续费技巧

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek免费额度到底能跑几个大模型&#xff1f; DeepSeek 官方为新注册用户提供 100 万 Token 的免费调用额度&#xff08;截至 2024 年底政策&#xff09;&#xff0c;但不同模型的 Token 消耗差异显著——…...

全域轨迹可回溯,高效破解煤矿灾害搜救难题 ——基于视频孪生无感定位的矿山轨迹溯源搜救技术解析方案

全域轨迹可回溯&#xff0c;高效破解煤矿灾害搜救难题——基于视频孪生无感定位的矿山轨迹溯源搜救技术解析方案一、方案前言煤矿井下瓦斯爆炸、顶板垮塌、透水冲击等灾害发生后&#xff0c;巷道结构损毁、通信供电中断、有害气体弥漫&#xff0c;现场环境瞬息万变。传统人员监…...

使用curl命令直接测试Taotoken大模型API连通性与功能

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用curl命令直接测试Taotoken大模型API连通性与功能 在集成大模型能力时&#xff0c;开发者有时需要在没有安装特定语言SDK的环境…...