Ubuntu/linux c开发5 UDP通讯
在项目中遇到个硬件厂家,用的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
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13