• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Ubuntu/linux c开发5 UDP通讯

武飞扬头像
勤又氪猿
帮助2

在项目中遇到个硬件厂家,用的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;
}
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbeikk
系列文章
更多 icon
同类精品
更多 icon
继续加载