【MFC】实现简单UDP通信

创建项目,初始化套接字

创建一个基于对话框的MFC项目(名称为UDP),高级功能选中Windows套接字

这个时候在CUDP类的InitInstance()方法中就会出现这样的代码用来初始化套接字

cpp 复制代码
if (!AfxSocketInit())
{
	AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
	return FALSE;
}

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

给对话框添加控件

控件ID 关联变量名 类型 作用
IDC_EDIT1 m_edit CEdit 显示接收到的信息
IDC_EDIT2 m_msg CString 保存发送的信息
IDC_EDIT3 m_otherPort UINT 设置对方端口号
IDC_EDIT4 m_myPort UINT 设置自己的端口号
IDC_IPADDRESS m_IPAddressCtrl CIPAddressCtrl ip地址

修改控件IDC_EDIT1的一些属性

创建CSocket类的派生类CUDPSocket

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

cpp 复制代码
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控件上

cpp 复制代码
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);
}

响应创建按钮创建套接字

cpp 复制代码
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.

响应消息发射按钮

cpp 复制代码
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字符集会出现中文后面更着韩文的情况,这个时候可以把字符集改成多字节字符集

实现效果

相关推荐
汉克老师7 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
智者知已应修善业10 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
云泽80811 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
AI进化营-智能译站12 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit12 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen8712 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码12 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler0112 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy11312 小时前
Linux进程与线程编程详解
linux·c++
A7bert77714 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测