【MFC】实现简单UDP通信

news2024/11/18 21:38:04

创建项目,初始化套接字

创建一个基于对话框的MFC项目(名称为UDP),高级功能选中Windows套接字
在这里插入图片描述
这个时候在CUDP类的InitInstance()方法中就会出现这样的代码用来初始化套接字

if (!AfxSocketInit())
{
	AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
	return FALSE;
}

如果没有选中,手动添加也是可以的。

给对话框添加控件

在这里插入图片描述

控件ID关联变量名类型作用
IDC_EDIT1m_editCEdit显示接收到的信息
IDC_EDIT2m_msgCString保存发送的信息
IDC_EDIT3m_otherPortUINT设置对方端口号
IDC_EDIT4m_myPortUINT设置自己的端口号
IDC_IPADDRESSm_IPAddressCtrlCIPAddressCtrlip地址

修改控件IDC_EDIT1的一些属性
在这里插入图片描述

创建CSocket类的派生类CUDPSocket

要添加虚函数OnReceive(),这个函数的作用是用来截获收到的网络数据。

void CUdpSocket::OnReceive(int nErrorCode)
{
	CString ipAdress;
	wchar_t msg[1024];
	UINT port;
	int len=ReceiveFrom(msg, 1023, ipAdress, port);
	msg[len] = '\0';
	CUDPDlg* pDlg =(CUDPDlg*) AfxGetMainWnd();
	pDlg->ShowMessage(msg, ipAdress, port);
	
	CSocket::OnReceive(nErrorCode);
}

ShowMessage()函数是在CUDPDLG中定义的一个用于显示信息的函数,用于将发送方的IP地址,端口号,发送信息和发送时间显示在IDC_EDIT1控件上

void CUdpSocket::OnReceive(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类
	CString ipAdress;
	char msg[1024];
	UINT port;
	int l=ReceiveFrom(msg, 1023, ipAdress, port);
	msg[l] =0;

	CTime time = CTime::GetCurrentTime();
	CString str;
	str.Format("的%d端口向你发送消息%s:\r\n%s\r\n", port, 
		time.Format("%Y-%m-%d %H:%M:%S"),msg);
	ipAdress += str;
	CUDPDlg* pDlg =(CUDPDlg*) AfxGetMainWnd();
	int len = pDlg->m_edit.GetWindowTextLength();
	pDlg->m_edit.SetSel(len, -1);
	pDlg->m_edit.ReplaceSel(ipAdress);

	
	CSocket::OnReceive(nErrorCode);
}

响应创建按钮创建套接字

void CUDPDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//创建stocket
	UpdateData(true);
	bool s=m_udpSocket.Create(m_myPort, SOCK_DGRAM);
	if (0 == s)
	{
		CString str;
		str.Format("创建socket失败:%d", GetLastError());
		MessageBox(str);
	}
	else {
		GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
		//如果创建成功禁用创建按钮
	}
}

SOCK_DGRAM表示的就是UDP.

响应消息发射按钮

void CUDPDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	CString ipAdress;
	m_IPAddressCtrl.GetWindowText(ipAdress);//获取IP地址控件上的ip地址

	if (ipAdress.IsEmpty() || ipAdress == L"0.0.0.0")
		MessageBox("请输入正确的ip地址");
	if(m_myPort==0)
		MessageBox("请输入当前主机端口号");
	if(m_otherPort==0)
		MessageBox("请输入对方端口号");
	if(m_msg.IsEmpty())
		MessageBox("请输入要发送的数据");
	m_udpSocket.SendTo(m_msg, m_msg.GetLength(), m_otherPort,ipAdress);
	CString str;
	str.Format("我向\r\n%s:%d发送消息:%s\r\n", ipAdress.GetBuffer(), m_otherPort,m_msg.GetBuffer());;
	m_edit.SetSel(m_edit.GetWindowTextLength(), -1);
	m_edit.ReplaceSel(str);
}

使用Unicode字符集会出现中文后面更着韩文的情况,这个时候可以把字符集改成多字节字符集
在这里插入图片描述

实现效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1001411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APC注入进阶“Early Bird”

序 APC注入在前面的章节已经给大家讲过,基本原理也是老生常谈的内容了: APC注入可以让一个线程在它正常的执行路径运行之前执行一些其他的代码,每一个线程都有一个附加的APC队列,他们在线程处于可警告的时候才被处理;…

【JAVA-Day04】Java关键字和示例:深入了解常用关键字的用法

Java关键字和示例:深入了解常用关键字的用法 摘要Java 关键字、标识符和命名规范一、Java 关键字常用关键字DEMO1. 示例代码使用 if 和 else 关键字:2. 示例代码使用 for 循环:3. 示例代码使用 switch 关键字:4. 示例代码使用 wh…

2022年第一界HiPChips解读

High Performance Chiplet and Interconnect Architectures,2022年6月19日,第一届会议(连同第49界ISCA会议)于美国纽约举行。 第一届会议议程及slice:(HiPChips Chiplet Workshop ISCA Conference)[https://www.open…

使用TCP方式拉取Canal数据

1 Canal对接Kafka联调 1.1 配置修改 canal.properties 修改 zk: canal.zkServers 10.51.50.219:2181instance.properties 开启配置项: canal.mq.dynamicTopic 是 Canal 的 MQ 动态 Topic 配置项: test_javaedge_01 是kafka 的 topicte…

混合云代表,青云科技QingCloud从此走向小而美之路

你有你的活法, 我有我的活法 只要活出自己, 活出个样子都是美事 【全球元观察 | 热点关注】 刚注意到青云科技QingCloud的最新发布2023年半年度报告,2023上半年同比减亏约7000万元,研发人员减少83人。从这两个数字…

贝wa儿歌(安卓)

本次贝wa儿歌为大家提供的是特殊版本的,软件需要注册登录才能才能使用VIP权限,安装好后,打开如果提示更新请点击取消,一定不要更新哦。 贝瓦儿歌不仅只是儿歌,其实有很多分类的,包括有国学,动画…

小米6/6X/米8/米9手机刷入鸿蒙HarmonyOS.4.0系统-刷机包下载-遥遥领先

小米手机除了解锁root权限,刷GSI和第三方ROM也是米粉的一大爱好,这不,在华为发布了HarmonyOS.4.0系统后不久,我们小米用户也成功将自己的手机干山了HarmonyOS.4.0系统。虽然干上去HarmonyOS.4.0系统目前BUG非常多,根本…

系统架构:软件工程速成

文章目录 参考第一章 概述软件工程概述软件过程 参考 软件工程速成(期末考研复试软考)均适用. 支持4K 第一章 概述 软件工程概述 定义:采用工程的概念、原理、技术和方法来开发与维护软件。 三要素: 方法:完成软件开发各项任务的技术方…

人工智能AI 全栈体系(二)

第一章 神经网络是如何实现的 上节描述的网络结构比较特殊,不具有一般性。比如前面我们讲过的权重都是1或者-1,这是很特殊的情况,实际上权重可以是任何数值,可以是正的,也可以是负的,也可以是带小数的。权…

网络安全岗位面试经验总结(附面试题)

思路流程: 信息收集 服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等) 网站指纹识别(包括,cms,cdn,证书等),dns记录 whois信…

Linux工具——gcc

目录 一,gcc简介 二,C语言源文件的编译过程 1.预处理 2.编译 3.汇编 4.链接 5.动静态库 一,gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio。其实这个gcc这个编译器实现的功能便是和visual studio一样的功能&…

纷享销客入选中国信通院《高质量数字化转型产品及服务全景图》

近期,在中国信息通信研究院主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中上,重磅发布了《高质量数字化转型产品及服务全景图(2023)》,纷享销客凭借先进的技术能力和十余年客户业务场景应用理解&#xf…

Linux fcntl函数

/*#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... ); 参数&#xff1a;- fd&#xff1a;需要操作的文件描述符- cmd&#xff1a;表示对文件描述符如何操作- F_DUPFD:复制文件描述符&#xff0c;复制的是参数fd&#xff0c;得到一个新的文件…

LeetCode:2. 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

Java学习笔记------抽象类和抽象方法

抽象方法 抽象方法&#xff1a;将共性的行为&#xff08;方法&#xff09;抽取到父类之后&#xff0c;由于每一个子类执行的内容是不一样的&#xff0c;所以&#xff0c;在父类中不能确定具体的方法体&#xff0c;该方法就可以定义为抽象方法抽象类&#xff1a;如果一个类中存…

d3.js 的使用

这篇文章相当于之前 svg 的补充。 因为 svg 代码肯定不是人为去专门写的。 在这里推荐制作 svg 的第三方库 - D3.js 用于定制数据可视化的JavaScript库 - D3 官网地址&#xff1a; D3 by Observable | The JavaScript library for bespoke data visualization 简单使用 画…

嵌入式基础知识-信息安全与加密

本篇来介绍计算机领域的信息安全以及加密相关基础知识&#xff0c;这些在嵌入式软件开发中也同样会用到。 1 信息安全 1.1 信息安全的基本要素 保密性&#xff1a;确保信息不被泄露给未授权的实体。包括最小授权原则、防暴露、信息加密、物理加密。完整性&#xff1a;保证数…

nginx-日志处理

access.log #正常请求的日志 error.log #访问错误日志&#xff0c;404&#xff0c;500等请求在这里 buffer&#xff1a;设置缓冲区&#xff0c;访问日志不会直接打到磁盘上&#xff0c;而是先积攒到缓冲区&#xff0c;缓冲区满了后在统一往…

H5打包APP和IOS实现免签,超级签,mam签,h5分发

博主技术笔记 博主开源微服架构前后端分离技术博客项目源码地址&#xff0c;欢迎各位star 微信公众号&#xff0c;每天给大家提供技术干货 http://yun.viphssp.top/root 打包出来的模板&#xff1a;https://yun.viphssp.top/mq/3/html/index.html

解决a标签内容中img标签和p标签垂直方向间隔太大的问题

现象如下&#xff1a; 对应的html结构&#xff1a; 解决办法&#xff1a;给a标签设置&#xff1a;display: inline-block和line-height属性。 然后问题解决&#xff1a; 具体原理如下&#xff08;由chatgpt回答&#xff09;&#xff1a; display: inline-block 可以减少垂直方…