Ubuntu/linux c开发(5) UDP通讯

2023-05-16

在项目中遇到个硬件厂家,用的UDP协议。由于,现场需求是要检测设备的状态,而UDP是一个不可靠的协议,只能通过接收他收到指令的返回值来判断当前状态,这就需要我们在发送指令后监听接收。而且,我们不可能一直死等接收结果,所以我们需要写一个非阻塞的接收。

直接上代码:
CUdp.h

#ifndef _UDP_H
#define _UDP_H

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <algorithm>

class CUdpEx
{
public:
	CUdpEx(void);
	~CUdpEx(void);

public:
	//向指定IP地址和端口发送数据
	static bool SendUdpData(const char* lpszIP, int nPort, const char *pData, int nLen);

	//非阻塞接收数据。
	bool revUdpData();
};
#endif

CUdp.cpp


#include "UdpEx.h"
static SOCKET g_hSocket = 0;

//发送的Socket句柄
void Perror(const char *s)
{
	perror(s);
	exit(EXIT_FAILURE);
}

//设置非阻塞
static void setnonblocking(int sockfd)
{
	int flag = fcntl(sockfd, F_GETFL, 0);
	if (flag < 0) 
	{
		Perror("fcntl F_GETFL fail");
		return;
	}
	if (fcntl(sockfd, F_SETFL, flag | O_NONBLOCK) < 0) 
	{
		Perror("fcntl F_SETFL fail");
	}
} 

bool CUdpEx::SendUdpData(const char* lpszIP, int nPort, const char *pData, int nLen)
{
	struct sockaddr_in addrRecv;
	addrRecv.sin_family = AF_INET;
	addrRecv.sin_port = htons(nPort);
	addrRecv.sin_addr.s_addr = inet_addr(lpszIP);
	int nSended = sendto(g_hSocket, 
		pData, 
		nLen, 
		0, 
		(sockaddr*) &addrRecv, 
		(int)sizeof(addrRecv));
	return (nSended == nLen);
}

bool CUdpEx::revUdpData()
{
	bool ret=false;
	struct sockaddr_in cliaddr;
	
	socklen_t len;
	long tempCount = GetCurrentSeconds();
	for ( ; ; )
	{
		char mesg[1024] = {};
		int n = recvfrom(g_hSocket, mesg, 1024, 0, (sockaddr *)&cliaddr, &len); 
		sleep(1); 		
		if (n>0)
		{
			ret = true;
			break;
		}
		else
		{
			//超时处理
			if (GetCurrentSeconds()-tempCount>ONE_SECONDS_1000_MS*8)
			{
				DPLOG_INFO("UDP","发送指令失败"<<errno);
				break;
			}
		}
	} 

	return ret;
}

CUdpEx::CUdpEx(void)
{
	if (g_hSocket==0)
	{
		//初始化Socket
		g_hSocket = socket(AF_INET,SOCK_DGRAM,0);
		assert(g_hSocket != -1);
		setnonblocking(g_hSocket);
	}
}

CUdpEx::~CUdpEx(void)
{
	close(g_hSocket); 
	g_hSocket = 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu/linux c开发(5) UDP通讯 的相关文章

  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 错误:命令“c++”失败,退出状态为 1

    所以我尝试按照以下说明安装 Pyv8https andrewwilkinson wordpress com 2012 01 23 integrating python and javascript with pyv8 https andre
  • 如何在 Linux 中重新添加 unicode 字节顺序标记?

    我有一个相当大的 SQL 文件 它以 FFFE 的字节顺序标记开头 我使用 unicode 感知的 linux 分割工具将此文件分割成 100 000 行块 但是当将这些传递回窗口时 它确实not与第一个部分以外的任何部分一样 只是它具有
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • SMP 上如何处理中断?

    SMP 对称多处理器 多核 机器上如何处理中断 内存管理单元是只有一个还是多个 假设两个线程 A 和 B 运行在不同的内核上 同时 访问页表中不存在的内存页面 在这种情况下 将会出现页面错误 并从内存中引入新页面 将会发生的事件的顺序是什么
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 请检查 PPA 名称或格式是否正确

    在我的 Ubuntu 14 04 中 我尝试安装 Captiva 图标包 如上所列这个 omgubuntu 帖子 http www omgubuntu co uk 2014 09 4 gorgeous linux icon themes d
  • Nginx 作为负载均衡器,具有 75% 和 25% 加权路由

    我是 Nginx 新手 我有两台服务器 serverA 和 serverB 我希望 75 的请求发送到 serverA 其余 25 的请求发送到 serverB 这可能吗 使用nginx加权路由 stream upstream stream
  • BASH 中的空函数

    我正在使用 FPM 工具创建 deb 包 此工具在从支持的文件中删除包之前 之后创建 不幸的是FPM生成的bash脚本包含这样的函数 dummy 该脚本退出时出现错误 语法错误 意外 BASH 不允许空函数吗 哪个版本的 bash linu
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec

随机推荐

  • 自定义ListView

    package com team3 baby widget import android annotation TargetApi import android content Context import android os Build
  • 实验三 栈的基本操作

    ZZU的学弟学妹们不要抄作业哦 一 实验目的 1 掌握栈的存储结构的表示和实现方法 2 掌握栈的入栈和出栈等基本操作算法实现 3 了解栈在解决实际问题中的简单应用 二 实验内容 1 建立顺序栈 并在顺序栈上实现入栈和出栈操作 2 建立链栈
  • android 任务进度,安排(进度条管理任务)

    安排用进度条的方式来为你进行进度条上面的管理 xff0c 你所做的每件事情都能够在这款软件上面展示出实时的进度 xff0c 从进度条的方式来提高你在工作和生活当中的效率 xff0c 让你能够知道你的某件事情在生活当中的完成程度 xff0c
  • c语言重定向printf函数,printf函数的重定向实现

    printf函数的重定向实现 2014 09 05 13 50 29 标签 xff1a 佛学 在嵌入式系统中 xff0c 串口常用来辅助调试输出一些调试信息 所以有必要实现串口的格式化输出功能 这可以由3种方法实现 就我目所知 1 使用系统
  • 虚拟机中那些可以作为root对象_当之无愧的黑科技神器,给你的手机安装一个虚拟机...

    我是一锅汤 精品软件推荐达人 让你普通的设备变得不普通 虚拟机的知识普及 在熬这锅汤的时候先给汤友们普及一下虚拟机的知识 xff0c 百度百科这样解释 xff1a 虚拟机指通过软件模拟的具有完整硬件系统功能的 运行在一个完全隔离环境中的完整
  • nextdate函数白盒测试问题 软件测试_nextdate白盒测试用例

    日期问题白盒测试用例的设计 日期问题白盒测试用例 题目 前一日函数PreDate是NextDate的逆函数 代码 请采用基路径方法对前一日函数进行测试用例设计 代码 NEXTDATE函数黑盒测试 IT 计算机 专业资料 黑盒测试用例分析 N
  • python中randrange函数_Python

    Python randrange 函数 描述 randrange 方法返回指定递增基数集合中的一个随机数 xff0c 基数默认值为1 语法 以下是 randrange 方法的语法 import random random randrange
  • word html 预览 打印出来,word打印预览显示全,但是打印出来不全

    打印Word文档的时候 xff0c 选择的是全部打印 xff0c 但是在打印的时候 xff0c 个别页面却出现了打印显示不全的情况 xff0c 这种问题应该如何解决呢 下面就跟着小编来看看吧 情况一 xff1a 打印机驱动可能有问题 xff
  • boa 上传文件到服务器,springMVC 上传文件到服务器

    public String uploading HttpServletRequest request 64 RequestParam 34 file1 34 MultipartFile file Model model throws Ill
  • css沿曲线进行动画,css3动画曲线运动

    Title box width 50px height 120px margin top 500px margin left 500px box2 width 50px height 120px background black box a
  • ios获取区域服务器信息,ios获取服务器数据

    ios获取服务器数据 内容精选 换一换 有以下几种方式 xff1a 应用服务器调用查询设备历史数据接口 xff0c 主动从物联网平台获取设备上报的数据 应用服务器调用订阅平台业务数据接口 xff0c 使物联网平台在设备上报数据时 xff0c
  • C++头文件的包含顺序研究

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 一 xff0e Google C 43 43 编程风格指南 里的观点 公司在推行编码规范 xff0c 领导提议基本上使用 Google C
  • java捕获子线程异常_Java中主线程如何捕获子线程抛出的异常

    首先明确线程代码的边界 其实很简单 xff0c Runnable接口的run方法所界定的边界就可以看作是线程代码的边界 Runnable接口中run方法原型如下 xff1a br public void run br 而所有的具体线程都实现
  • 大疆4rtk_解密大疆精灵4rtk-后差分定位技术(PPK)

    RTK技术大家已经非常了解 xff0c 优势自不必说 xff0c 虽然作业距离远但总是有接收不到差分信号的时候 xff0c 或者有的时候在山区测量移动站作业距离近 xff0c 远了就没办法接收到差分信号 xff0c 这就是RTK的弊端 xf
  • vue跨域使用websocket_vue使用SockJS实现webSocket通信

    以前使用websocket都是使用 window webSocket 61 new WebSocket 39 ws 39 43 config webSocketUrl 43 39 webData websocket token 61 39
  • html进度条动画效果,CSS3创建时尚且具有动画效果的进度条

    我们看到各种各样的进度条 xff0c 这些进度条显示了流程的当前完成状态 xff0c 例如下载或文件传输 无论是在构建桌面应用程序还是在构建Web应用程序 xff0c 都可能需要使用此UI元素 在本文中 xff0c 将介绍如何使用CSS3创
  • 树莓派python gpio 模仿iic_GPIO实现I2C协议模拟(1)

    最近需要用GPIO模拟I2C协议 xff0c 如果是在Linux下面比较简单 xff0c 但在Windows下面 xff0c 是否有没Linux那么简单了 索性自己对I2C协议还有一些了解 xff0c 翻了SPEC并结合示波器量出的实际信号
  • Ubuntu/linux c开发(1) GB2312/UTF8相互转换

    由于工作原因最近开始搞linux开发 xff0c 写几个服务程序 编码格式的转换算是基础之一 网上也有现成的代码 xff0c 只是有一些小问题需要注意 xff0c 这里自己保存一下 xff1a 1 判断字符是否是utf8字符 判断字符串是否
  • stm32CubeMX的安装和点亮流水灯

    文章目录 一 JDK的下载 安装和配置1 JDK的下载2 JDK的安装3 JDK的配置4 测试 二 CubeMX的下载和安装1 CubeMX的下载2 CubeMX的安装 三 利用CubeMX新建工程点亮LED灯1 题目介绍2 CubeMX介
  • Ubuntu/linux c开发(5) UDP通讯

    在项目中遇到个硬件厂家 xff0c 用的UDP协议 由于 xff0c 现场需求是要检测设备的状态 xff0c 而UDP是一个不可靠的协议 只能通过接收他收到指令的返回值来判断当前状态 xff0c 这就需要我们在发送指令后监听接收 而且 xf