C++下UDP网络通信UDP_Demo例子(VS)

下面是一个简单的udp网络通信demo(VS)。

客户端:

头文件udpclient.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

#define MAX_READ_LINE 1600

class udpClient
{

public:
	udpClient();
	~udpClient();

	int Init(const char * szServerIP,  int nServerPort);
	int SendData(uint8_t *pData, int nLen);

private:
	int socket_fd = -1;
	int recv_len = -1;

	struct sockaddr_in u_sockaddr;
};

源文件udpclient.cpp

#include "udpclient.h"

udpClient::udpClient()
{
}
udpClient::~udpClient()
{
}
int  udpClient::Init(const char * szServerIP,  int nServerPort)
{
	socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
	if (socket_fd < 0)
	{
		LOG_E("socket error : {} errno: {}", strerror(errno), errno);
		return -1;
	}

	//初始化sockaddr_in结构体
	memset(&u_sockaddr, 0, sizeof(struct sockaddr_in));
	u_sockaddr.sin_family = AF_INET;
	u_sockaddr.sin_port = htons(nServerPort);
	inet_pton(AF_INET, szServerIP, &u_sockaddr.sin_addr);

	LOG_I("init udp success.IP = {} port = {}",szServerIP, nServerPort);

	return 0;
}
int  udpClient::SendData(uint8_t *pData, int nLen)
{
	//向server发送数据
	if(sendto(socket_fd, pData, nLen, 0, (struct sockaddr *) &u_sockaddr, sizeof(struct sockaddr_in)) < 0)
	{
		 LOG_E("send message error : {} errno: {}", strerror(errno), errno);
		return -1;
	}

	LOG_ACTIVE(100,  "send udp len = {}", nLen);
	return 0;
}

服务端:

头文件udpServer.h

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>

#define MAX_READ_LINE 1500

typedef void (*udp_data_callback)(unsigned char* data, int len, void *userdata);

class udpServer
{

public:
	udpServer();
	~udpServer();

	int Init(int nPort);
	void Uninit();
	void SetDataCB(udp_data_callback cb, void *pUserData); 
	int RecvData();

private:
	struct sockaddr_in u_sockaddr;
	udp_data_callback m_UdpCallback;
	void *m_pUserData = nullptr;
	int server_fd = -1;
	uint8_t *m_pBuffer = nullptr;
	bool m_bInited = false;
};

源文件udpServer.cpp

#include "udpServer.h"

udpServer::udpServer()
{
}
udpServer::~udpServer()
{
	Uninit();
}
int udpServer::Init(int nPort)
{
	//初始化sockaddr_in结构体
	memset(&u_sockaddr, 0, sizeof(u_sockaddr));      //bzero(&u_sockaddr,sizeof(u_sockaddr));
	u_sockaddr.sin_family = AF_INET;
	u_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	u_sockaddr.sin_port = htons(nPort);

	//创建server端的socket套接字
	server_fd = socket(AF_INET,  SOCK_DGRAM, 0);
	if (server_fd < 0)
	{
		LOG_E(" socket error{} errno: {}" , strerror(errno), errno);
		return -1;
	}

	int flag = 1;
	if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&flag, sizeof(flag)) < 0)
	{
		LOG_E("setsockopt error{} errno: {} nPort: {}" , strerror(errno), errno, nPort);
		return -1;
	}

	LOG_I("setsockopt success.port = {}", nPort);

	//绑定
	int ret = bind(server_fd,(struct sockaddr *) &u_sockaddr,sizeof(u_sockaddr));
	if (ret < 0)
	{
		LOG_E("bind socket error{} errno: {} nPort: {}" , strerror(errno), errno, nPort);
		 return -1;
	}

	LOG_I("bind socket success.port = {}", nPort);

	if(!m_pBuffer)
	{
		m_pBuffer = new uint8_t[MAX_READ_LINE];
	}

	return 0;
}
void udpServer::Uninit()
{
	if(m_pBuffer)
	{
		delete[] m_pBuffer;
		m_pBuffer = nullptr;
	}
	m_UdpCallback = nullptr;
	if(server_fd>=0)
	{
	close(server_fd);
	server_fd = -1;
	}
}
void udpServer::SetDataCB(udp_data_callback cb, void *pUserData)
{
	m_UdpCallback = cb;
	m_pUserData = pUserData;
}
int udpServer::RecvData()
{
	if(!m_bInited)
	{
		Init(8888);
		m_bInited = true;
	}

	socklen_t socklen = sizeof(u_sockaddr);
	//读取客户端数据到buff中
	int recv_len = recvfrom(server_fd, m_pBuffer, MAX_READ_LINE, 0, (struct sockaddr *)&u_sockaddr, &socklen);
	if (recv_len < 0)
	{
		LOG_E("recv_len = {}  server_fd = {} error{} errno: {} ", recv_len, server_fd, strerror(errno), errno);
		return -1;
	}

	LOG_ACTIVE(500, "recv : buff = {}", recv_len);

	if(m_UdpCallback)
	{
		m_UdpCallback(m_pBuffer, recv_len, m_pUserData);
	}

	return recv_len;
}

版权声明:本文为博主原创文章,转载请附上博文链接!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++可以通过使用套接字(Socket)来实现UDP通信。下面是一个简单的C++代码示例,演示了如何使用UDP套接字进行通信: ```cpp #include <iostream> #include <string> #include <cstring> #include <arpa/inet.h> #include <sys/socket.h> int main() { // 创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { std::cerr << "Failed to create socket" << std::endl; return -1; } // 设置服务器地址和端口 struct sockaddr_in serverAddr{}; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12345); // 设置端口号 serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置IP地址 // 发送数据 std::string message = "Hello, UDP Server!"; if (sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) { std::cerr << "Failed to send data" << std::endl; close(sockfd); return -1; } // 接收数据 char buffer[1024]; memset(buffer, 0, sizeof(buffer)); socklen_t serverAddrLen = sizeof(serverAddr); if (recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&serverAddr, &serverAddrLen) == -1) { std::cerr << "Failed to receive data" << std::endl; close(sockfd); return -1; } // 输出接收到的数据 std::cout << "Received data: " << buffer << std::endl; // 关闭套接字 close(sockfd); return 0; } ``` 上述代码中,首先创建了一个UDP套接字,然后设置服务器的地址和端口。接下来,使用`sendto`函数发送数据到服务器,并使用`recvfrom`函数接收服务器返回的数据。最后,关闭套接字。 注意:上述代码只是一个简单的示例,实际应用中可能需要进行错误处理、超时处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值