一、有些东西写一次就够了--UDP网络通信类模板

本文介绍了UDP协议的特点,如非连接性、小开销等,并通过一个简单的UDP通信类模板展示了如何进行UDP的发送与接收。通过ping命令解释了UDP与ICMP协议在网络通信中的作用,同时详细说明了UDP数据包头的结构。
摘要由CSDN通过智能技术生成

UDP(User Data Protocol,用户数据报协议)
1、UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

2、 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等, 因此一台服务机可同时向多个客户机传输相同的消息。

3、UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

4、吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、 源端和终端主机性能的限制。

5、UDP使用尽最大努力交付,即不保证可靠交付, 因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

6、UDP是面向报文的。发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界, 因此,应用程序需要选择合适的报文大小。

我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常, 其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包, 如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

ping命令是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping命令是使用 IP 和网络控制信息协议 (ICMP),因而没有涉及到任何传输协议(UDP/TCP) 和应用程序。它发送icmp回送请求消息给目的主机。

ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。

UDP的包头结构:
源端口 16位

目的端口 16位

长度 16位

校验和 16位一、有些东西写一次就够了–UDP网络通信类模板

下面我写了一个简单的UDP通信的类模板,可以无限次复用,有些东西写一次就够了~

首先是UDP接收

#ifndef UDPRECVCONFIG_H
#define UDPRECVCONFIG_H

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

template <typename NetRecvDataType> class UdpNetRecvCtrl
{
   
public:
	//初始化网络配置
	UdpNetRecvCtrl(char *LocalIp, unsigned int iRecvPort, bool bGroup = false, char * sGroupIp = "", unsigned int iMsg = 0)
	{
   
		assert((iRecvPort > 1024) && (iRecvPort < 65535));

		m_strLocalIP = LocalIp;
		m_iLocalPort = iRecvPort;
		m_bGroupRecv = bGroup;
		m_strGroupIP = sGroupIp;
		
		m_bSockValid = false;
		m_bRecvValid = false;
		m_iRecvCount = 0;
		m_iRecvLen   = 0;
		m_Socket     = 0;
		strSockName  = "";
		m_iMsg       = iMsg;

		bSockNameValid = false;

		m_Socket = socket(AF_INET, SOCK_DGRAM, 0);
		if(m_Socket == -1)
		{
   
			perror("Socket Create Fail");
			return;
		}
		//绑定本地
		memset(&m_addr, 0, sizeof(m_addr));
		m_addr.sin_family = AF_INET;
		m_addr.sin_port = htons(m_iLocalPort);
		m_addr.sin_addr.s_addr = inet_addr(m_strLocalIP);
		reuse = true;
		ret = setsockopt(m_Socket, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse, sizeof(bool));
		if(ret < 0)
		{
   
			perror("Set Socketopt Fail");
			return;
		}

		ret = bind(m_Socket
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值