C++使用UDP

news/2024/5/18 12:35:57 标签: c++, udp, 网络编程

C++使用UDP

对C++使用UDP做了简单封装,可直接运行

udph_2">头文件udp.h

#pragma once
#include <Winsock.h>
#pragma comment(lib,"WS2_32.lib")

#define LOCAL_IP_ADDR      INADDR_ANY      //当前应用程序接收的IP地址
#define LOCAL_PORT         9527            //当前应用程序的端口

#define DEST_IP_ADDR       "127.0.0.1"     //目标应用程序的IP地址
#define DEST_PORT          9526            //目标应用程序的端口

class UDP
{
public:
	UDP();
	~UDP();
	void setLocalSockAddr(unsigned long localAddr, const int localPort);  //设置当前应用程序的IP地址和端口
	void setDestSockAddr(const char* destAddr, const int destPort);       //设置目标应用程序的IP地址和端口
	int sendData(char* buf, int len);
	int recvData(char* buf, int len);

private:
	WSADATA m_wsaData;
	SOCKET m_Socket;
	sockaddr_in m_localSockAddr; //当前应用程序的sockaddr_in结构体
	sockaddr_in m_destSockAddr;  //目标应用程序的sockaddr_in结构体
};

udpcpp_31">源文件udp.cpp

#include "udp.h"

UDP::UDP()
{
	WSAStartup(MAKEWORD(2, 2), &m_wsaData);
	m_Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

	//将socket设为非阻塞模式
	u_long mode = 1;
	ioctlsocket(m_Socket, FIONBIO, &mode);

	//设置当前程序和目标程序的配置
	setLocalSockAddr(LOCAL_IP_ADDR, LOCAL_PORT);
	setDestSockAddr(DEST_IP_ADDR, DEST_PORT);
}

UDP::~UDP()
{
	closesocket(m_Socket);
	WSACleanup();
}

//设置当前应用程序的IP地址和端口
void UDP::setLocalSockAddr(unsigned long localAddr, const int localPort)
{
	//当前应用程序的配置
	m_localSockAddr.sin_family = AF_INET;
	m_localSockAddr.sin_addr.s_addr = htonl(localAddr);
	m_localSockAddr.sin_port = htons(localPort);
	//绑定当前应用程序套接字
	bind(m_Socket, (SOCKADDR*)&m_localSockAddr, sizeof(m_localSockAddr));
}

//设置目标应用程序的IP地址和端口
void UDP::setDestSockAddr(const char * destAddr, const int destPort)
{
	//目标应用程序的配置
	m_destSockAddr.sin_family = AF_INET;
	m_destSockAddr.sin_addr.s_addr = inet_addr(destAddr);
	m_destSockAddr.sin_port = htons(destPort);
}

int UDP::sendData(char * buf, int len)
{
	int ret = sendto(m_Socket, buf, len, 0, (SOCKADDR*)&m_destSockAddr, sizeof(m_destSockAddr));
	return ret;
}

int UDP::recvData(char* buf, int len)
{
	int sockAddrSize = sizeof(sockaddr_in);
	int ret = recvfrom(m_Socket, buf, len, 0, (SOCKADDR*)&m_localSockAddr, &sockAddrSize);
	return ret;
}

使用示例

程序1

#include <iostream>
#include "udp.h"

int main()
{
	UDP udp;
	while (1)
	{
		char buf[1024];
		int ret = udp.recvData(buf, 1024);
		if (ret > 0)
		{
			std::cout << "server recv: " << buf << std::endl;
		}
		else
		{
			std::cout << "server recv: " << "recv failed" << std::endl;
		}
		Sleep(1000);
	}

	return 0;
}

程序2

需要先将udp.h中宏定义的IP和端口修改一下

#define LOCAL_IP_ADDR      INADDR_ANY      //当前应用程序接收的IP地址
#define LOCAL_PORT         9527            //当前应用程序的端口

#define DEST_IP_ADDR       "127.0.0.1"     //目标应用程序的IP地址
#define DEST_PORT          9526            //目标应用程序的端口
#include <iostream>
#include "udp.h"

int main()
{
	UDP udp;
	while (1)
	{
		char buf[1024] = "hello udp...";
		udp.sendData(buf, 1024);
		std::cout << "client send: " << buf << std::endl;
		Sleep(1000);
	}
	
	return 0;
}

程序运行效果

将两个程序一起打开,可以看到运行结果
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5268889.html

相关文章

Swin-Transformer 在图像识别中的应用

1. 卷积神经网络简单介绍 图像识别任务主要利用神经网络对图像进行特征提取&#xff0c;最后通过全连接层将特征和分类个数进行映射。传统的网络是利用线性网络对图像进行分类&#xff0c;然而图像信息是二维的&#xff0c;一般来说&#xff0c;图像像素点和周围邻域像素点相关…

离线编译安装opencv库及多版本切换[ubuntu]

系统版本&#xff1a;ubuntu18.04 库版本&#xff1a;opencv4.6.0 & opencv3.6.0 一、多版本安装前准备 1. 卸载已经安装的opencv版本[可选] 1.1 卸载从软件仓库中安装的opencv sudo apt-get purge libopencv* 1.2 卸载使用source自行编译安装的opencv 首先进入原先编译…

课设:FPGA音频均衡器 verilog设计及仿真 加报告

FPGA音频均衡器:将音频处理发挥到极致 引言: 随着音频技术的不断进步和音乐产业的飞速发展,人们对于音质的要求越来越高。而FPGA音频均衡器作为一种集数字信号处理与硬件加速技术于一体的创新解决方案,为音频处理带来了全新的可能性。本文将介绍什么是FPGA音频均衡器,以及…

Linux 常用的操作命令

我们习惯的使用Windows,安装软件进行使用&#xff0c;比如 WPS&#xff0c;浏览器&#xff0c;一些工具&#xff0c;但是在Linux上就需要用命令去操作&#xff0c;也可以使用像Ubuntu 和 CentOS这类的可视化面板 Linux系统是开源的&#xff0c;所以开发人员可以反复的发现Bug以…

opencv 十六 python下各种连通域处理方法(按面积阈值筛选连通域、按面积排序筛选连通域、连通域分割等方法)

本博文基于python-opencv实现了按照面积阈值筛选连通域、按照面积排序筛选topK连通域、 连通域细化(连通域骨架提取)、连通域分割(基于分水岭算法使连通域在细小处断开)、按照面积排序赛选topK轮廓等常见的连通域处理代码。并将代码封装为shapeUtils类,在自己的python代码…

人工智能在红斑狼疮应用主要以下4个方面

人工智能&#xff08;Artificial Intelligence, AI&#xff09;在医学领域的应用已取得了一定的进展。红斑狼疮&#xff08;Systemic Lupus Erythematosus, SLE&#xff09;是一种免疫系统性疾病&#xff0c;对该疾病进行诊断和治疗是一个复杂的过程。人工智能可以发挥作用&…

MeterSphere files 任意文件读取漏洞复现 (CVE-2023-25573)

0x01 产品简介 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能,全面兼容 JMeter、Selenium 等主流开源标准。 0x02 漏洞概述 MeterSphere /api/jmeter/download/files 路径文件存在文件读取漏洞,攻击者可通过该漏洞读取系统重要…

Github 2023-12-16开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-16统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目2非开发语言项目2TypeScript项目1Jupyter Notebook项目1Go项目1PHP项目1JavaScript项目1C#项目1 精…