C语言udp的封装和使用

c语言实现udp广播和组播 2、填充服务端的结构体,绑定广播地址和端口号(struct sockaddr_in serveraddr,serveraddr.sin_addr.s_addr = htonl(INADDR_ANY)))(需要设置端口复用) 3、创建结构体存放客户端IP和端口,接收数据。C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须 是“110” 13 C类地址范围 192.0.0.1 - 223.255.255.254 //192.168.14.2。发送给该地址的数据包被所有主机接收。 阅读详情

本文原地址:C语言udp的封装和使用

使用C++ 将udp做一个简单的封装,实现及时通讯,以供大家参考学习和自己备用

本项目由QT编写, windows下需要在 .pro文件需要加入以下配置:
#-lWs2_32 添加库Ws2_32
LIBS += -lWs2_32

测试方法:编译通过后,win+R 输入cmd 回车打开命令窗口
发送端:
输入.exe文件名后边加IP地址
接受端:
输入.exe文件名直接运行
退出:
输入exit回车退出

代码如下:
udp.h

#ifndef UDP_H
#define UDP_H

#ifdef MYLINUX

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SOCKET int

#else

#include <winsock2.h>

#endif

//明确此函数是C语言函数,编译时候不要转换成C++格式了
//extern "C"
//{

//}

class myudp{
private:
    SOCKET st;

public:
    myudp();
    ~myudp();
    int socket_bind(short int port);
    int socket_send(const char *IP, const short int port, const char *buf, int len);
    int socket_recv(char *buf, int len, char *srcIP);

};


#endif // UDP_H

udp.cpp

#include <string.h>
#include <stdio.h>
#include "udp.h"

int myudp::socket_send(const char *IP, const short int port, const char *buf, int len){


    /**
     * 建立socket
     * AF_INET 指定使用TCP/IP协议
     * SOCK_DGRAM 指定使用UDP协议
     */
    st = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));//初始化结构
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);//host to net short
    addr.sin_addr.s_addr = inet_addr(IP);

    //IP 内存原理解析
//    unsigned long laddr = inet_addr("192.168.6.200");
//    unsigned char *p = &laddr;
//    printf("IP_long:%x\n", laddr);
//    printf("IP_char:%u,%u,%u,%u\n", *(p),*(p+1),*(p+2),*(p+3));
    size_t rc = sendto(st, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr));


    return rc;
}

int myudp::socket_recv(char *buf, int len, char *srcIP){
    struct sockaddr_in sendaddr;
    memset(&sendaddr, 0, sizeof(sendaddr));

#ifdef MYLINUX
    socklen_t addrlen;
#else
    int addrlen;
#endif

    addrlen = sizeof(sendaddr);

    memset(buf, 0, len);
    //接受UDP数据
    size_t rc = recvfrom(st, buf, len, 0, (struct sockaddr *)&sendaddr, &addrlen);
//    printf("%s:%s\n", inet_ntoa(sendaddr.sin_addr), buf);
    if(srcIP)
    strcpy(srcIP, inet_ntoa(sendaddr.sin_addr));
    return rc;
}

myudp::myudp()
{
#ifndef MYLINUX

    /**
     * 初始化socket
     */
    DWORD ver;
    WSADATA wsaData;

    ver = MAKEWORD(1, 1);//在WSAStartup之前,告诉windows使用Socket的版本号
    WSAStartup(ver, &wsaData);//windows要求,使用socket必须调用这个函数
#endif

    /**
     * 建立socket
     * AF_INET 指定使用TCP/IP协议
     * SOCK_DGRAM 指定使用UDP协议
     */
    st = socket(AF_INET, SOCK_DGRAM, 0);
}

myudp::~myudp()
{
#ifdef MYLINUX
    close(st);
#else
    closesocket(st);//关闭socket
    WSACleanup();//释放win中 socket相关资源
#endif
}

//将接收方和端口号绑定
int myudp::socket_bind(short port)
{

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));//初始化结构
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);//host to net short
    addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY接收方的主机ip

    int localBind = bind(st, (struct sockaddr *)&addr, sizeof(addr));

    return localBind;
}

main.cpp

#include <iostream>
#include "udp.h"

#define PORT 8080

using namespace std;

int main(int argc, char *args[])
{
    if(argc > 1){
    myudp udp;
    char buf[1024] = {0};
    while(1){
        memset(buf, 0, sizeof(buf));
        gets(buf);
        udp.socket_send(args[1], PORT, buf, strlen(buf));
        if(strncmp(buf, "exit", 4) == 0)
            break;
    }

    }else{
    myudp udp;
    char buf[1024] = {0};
    if(udp.socket_bind(PORT) > -1){
        cout << "bind success !" << endl;
        char ip[100] = {0};
        while(1){
            memset(buf, 0, sizeof(buf));
            memset(ip, 0, sizeof(ip));

            udp.socket_recv(buf, sizeof(buf), ip);
            if(strncmp(buf, "exit", 4) == 0)
                break;
            cout << buf << endl;
            cout << ip << endl;
        }

    }

    }

    cout << "over" << endl;
    return 0;
}
关于c语言的udp通讯详细讲解 UDP全称 User Datagram Protocol,即:用户数据报协议。是面向无连接的协议。通常,UDP 通信还会被冠以不可靠的头衔。这里的不可靠指的是:无法可靠地得知对方是否收到数据。 阅读详情

相关推荐

【计算机网络】TCP和UDP的封装以及案例

从上述的操作可以看出,TCP和UDP存在很多重复代码,如何后续需要搭建服务器,那么我们可以将重复的部分封装成一个共享库,方便后续调用实现。:地址结构体的字节数,用于区分 sockaddr_un还是sockaddr_in。功能:把字符串格式的点分十进制表示的ip地址转换成整数形式的ip地址(大端)功能:把整数形式的ip地址转换成字符串格式的点分十进制表示的ip地址。1、既告诉函数当前src_addr结构体的字节数。:既是输入,也是输出 这里要取地址!功能:TCP协议通信时专用的数据发送函数。

m0_44965777的博客 1329

UDP C++类封装

2. Connect接口按理是通信方只有一个时使用,只是将IP地址和端口号进行了存储,发送时不会对数据包再进行 IP地址和Port的安全检查,更快速,适用于发送频繁场景。测试发现ip不通Connect接口都是返回成功,估计底层返回的是存储结果,并不是连接对端的结果。1. 客户端SendTo即使给ping不通的ip发送也是同样返回成功,估计因为UDP是无连接的,只是成功发出了本机端口,对方是否接收成功不管;linux gcc编译:gcc -o main main.cpp udp.cpp -lstdc++

wangshuping18的博客 736

Linux C UDP Socket实现客户与服务器简单通信

在linux平台下用c语言udp协议实现客户与服务器的简单通信与封装的实现一、服务器端1、新建CreateServer.c和CreateServer.h文件,服务器的创建代码在此实现,程序中封装了创建TcpSocket和UdpSocket服务器的方法,可直接调用函数创建服务器,客户端的业务则单独处理,方便了逻辑设计与代码移植。CreateServer.h代码如下:#ifndef CREATESERV

wanna_wsl的博客 2348

C++ UDP C/S 简单封装

Server端类定义: #include #pragmacomment(lib, "ws2_32.lib")   class UDPServer{ private: WSADATAwsaData; SOCKETserverSocket; sockaddr_inserverSockAddr; public: UDPServer();

Han的小站 3955

C语言实现TCP Socket客户端数据发送

本文还有配套的精品资源,点击获取 简介:网络编程是IT领域的重要组成部分,而Socket编程是客户端和服务器间通信的关键技术。本示例展示了如何使用C语言进行TCP Socket通信,包括创建连接、发送数据、接收数据、封装函数以及错误处理等方面。通过理解这些基础操作,初学者可以打下网络编程的坚实基础,并进一步探究多线程、异步I/O等高级主题,提升系统的稳定性和健壮性。 ...

weixin_35935514的博客 2577

c# 做项目工程中封装的udp使用类

做项目封装的UDP类,便于以后项目中直接使用,希望帮助到大家

Qt中实现UDP的分包和组包——参考“草上爬”的博客

一、为啥我们要分包组包?直接发不行吗? 最初你可能会存在这样的疑惑?所以我们需要了解下TCP和UDP在Qt中的区别。这里参考了阿拉丁的博客 顺便引用他的图;至于TCP和UDP相应的C/S架构图也可以通过这个兄弟的博客了解,当然还有TCP和UDP在Qt中如何实现。 ①UDP和TCP表格对比 ②在Qt中使用UDP和TCP的一些函数 ③阅读关于Qt中UDP的writeDatagram 通过阅读下图的文档便可以知道:UDP一次性发送的数据量是有限的,所以我们必须要分包!!! 至于为啥UDP需要分包,TCP不需

qq_42615475的博客 5738

C#聊天室建设工具 UDP封装的组件

添加引用 chatUDP1.Listen(7190);//绑定端口号 chatUDP1.Send(serverip, 7189, System.Text.Encoding.Default.GetBytes(htmlSendMsg.Text+"\r\n"));//发送内容 private void chatUDP1_DataArrival(byte[] Data, IPAddress Ip, int Port) { richTextBox2.Text += System.Text.Encoding.Default.GetString(Data); testUDP2.Send(Ip, 7190, Data); } //收到内容

C语言小工具封装 —— NetWork(TCP、UDP)

Linux环境下用C语言编写基于TCP和UDP协议的网络工具

helloworld1932的博客 366

LMX2594时钟配置实战:TICS PRO从入门到寄存器导出

本文详细介绍了LMX2594时钟芯片的配置实战,重点讲解了如何使用TICS PRO调试软件简化复杂的寄存器设置过程。通过实例演示从基础频率配置到高级参数调优的全流程,并分享SPI写入的嵌入式系统移植技巧,帮助工程师快速掌握高性能时钟芯片的配置方法。

weixin_29189003的博客 551

大学生智能车竞赛初次尝试经验分享--1(硬件绘制电路,pcb部分)

本人机械电子专业大二暑假参加全国大学生智能车竞赛,之前参加过一些其他类型的比赛有一点基础,由于之前疫情影响所以做智能车比赛断代了,没有学长带也没有思路,从一开始的一头雾水逐渐摸索出我感觉比较实用的经验。 一.首先是硬件的准备工作: 1.硬件部分与要自己设计需要的电路制成pcb。推荐使用Altium Designer20,AD比较常用所以有多实用的教学视频,另外需要自己了解布线规则,包括信号线,电源线常用的宽度 一些电源电路,驱动电路建议用multisim仿真,没有问题再进行制版 单片机有关的需要仿真

weixin_52679034的博客 9831

C语言UDP封装库,测试下

server: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include "trans_util.h" #include "msrt_api.h" #define SEND_BUF_SIZE (256 * 1024) static unsigned int g_connect_id = 0; static unsigned int g_o

爱片闲串,爱钓鱼,爱中医,爱分享 606

OpenClaw插件配置错误修复完全指南

插件文件名是插件目录结构正确package.json配置正确OpenClaw的插件系统还在快速迭代,偶尔会遇到这种配置问题。看错误信息检查配置文件检查实际文件对比差异修复问题大部分问题都能解决。查看官方文档:https://openclaw.ai/docs提Issue:https://github.com/openclaw/openclaw/issues加入Discord社区求助快速修复命令汇总。

Maynor的博客 4092

TCP/UDP 通用通信代码库(C语言实现)

C 语言实现 TCP/UDP 通用通信代码库:高效网络编程的利器

m0_71974552的博客 2061

[案例四] 智能填写属性工具(支持装配组件还有建模实体属性的批量创建、编辑)

本次案例主要是对上次导出自动导出BOM的一个前处理,要想导出属性,首先的有属性。于是本着学习的态度进行制作,可能有些功能有点别扭(支持装配环境下组件属性的批量填写,支持建模环境下的实体(不包括装配组件实体)——为了减负我把其过滤掉了,一般没人会往装配体里添加进行建模吧,但是不免有奇葩,哈哈哈)。

weixin_47753171的博客 1980

基于STM32L4XX、HAL库的AD7124-8BCPZ模数转换器ADC驱动程序设计

/ 公式: Voltage = (adc_value / (2^23 - 1)) * Vref。// 模式控制位[7:5]=000 (连续转换模式)// 3.2 配置通道0,使其使用AIN0(+)和AIN1(-),并关联到配置0和滤波器0。= 0x14) { // AD7124-8的ID是0x14。// 双极性操作,缓冲AINP/AINN。

zhusl6688的博客 375

socket udp单播和组播的简单封装

我封装了一个udp的接口,有些地方还需要改进,但基本满足大部分的需求 // A code block var foo = 'bar';

我要吃欢欢的博客 1776

巡检机器人的基于ROS系统的任务管理架构设计总结

本文探讨了基于ROS(机器人操作系统)的工业巡检机器人任务管理架构设计,提出分层闭环方案。架构围绕稳、准、活、扩四大目标,分为感知层(多源数据融合)、调度层(智能决策)、执行层(动作控制)和数据层(存储交互)。关键技术包括ROS2实时性优化、功能包复用和多机器人协同调度。实践案例显示,该架构在电力巡检中使任务完成率达99%,在化工园区实现95%覆盖率。当前挑战包括SLAM地图漂移和多机通信延迟,未来可通过语义SLAM和区域通信优化。

start_up_go的博客 464

raw socket的udp报文发送代码

#define NET_BUF_INIT_OFF 100typedef struct{ int type; struct sockaddr_in addr_dst; struct sockaddr_in addr_src; char databuf[8192]; char *data_ptr; int data_len;}NET_

358

Spring AI 项目实战(十):Spring Boot + AI + DeepSeek 构建智能合同分析技术实践(附完整源码)

摘要:基于Spring AI的智能合同审核系统开发 本文介绍了基于Spring Boot 3.2.0和Spring AI 1.0.0-M4构建的智能合同审核系统。系统采用分层架构设计,整合DeepSeek API实现文档解析、条款提取和风险分析功能。核心技术栈包括Spring AI、H2数据库、Apache POI/PDFBox等文档处理工具,实现了合同条款语义分析、异常识别和审核报告自动生成。项目解决了传统人工审核效率低、主观性强等问题,为合同管理提供了智能化解决方案。文章详细阐述了系统架构设计、技术选型

博客 653

全覆盖路径规划开源项目Clean-robot-turtlebot3原理及流程概括总结

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 6102

udp 通信程序

用c语言写一个服务端udp_srv.c的udp通信; 写一个udp的类udpsocket.hpp,封装接口: 调用udpsocketchpp类,写udp客户端udp_cli.cpp

黑桃K 355

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言初学者编程水平上不来?不妨尝试这10个C语言例子

初学者通过下面几个c语言,大家可以提高自己的编程水平,

一口Linux的专栏 1286

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言实现简易TCP/IP协议栈全过程(附完整源码下载)

掌握网络协议核心原理,从C语言实现简易TCP/IP协议栈入门开始。本文详述ARP、IP、ICMP等协议封装与解析,适用于嵌入式开发学习与网络教学,代码简洁可移植,附完整源码下载,值得收藏。

IterLoom的博客 1152

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深入探讨UDP协议

通过深入探讨UDP协议的工作原理、实现方式、优势与局限性以及应用场景举例,我们可以更好地理解UDP协议的特点和应用场景,并在实际应用中选择合适的协议和技术。UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,它在IP协议(互联网协议)上工作,为应用程序提供了一种发送和接收数据报的基本方式。同时,由于没有连接的维护开销,UDP也具有较低的资源消耗。(2)高效传输:UDP协议头部开销较小,只有8个字节,相比TCP协议的20个字节的头部开销,UDP具有更高的传输效率。

san_que的博客 633

C语言UDP socket编程

C语言UDP socket编程 UDP 服务器步骤如下: 1.创建等链接套接字fd=socket() 2.绑定待链接套接字bind(fd,服务器ip和端口) 3.等待信息recvfrom(fd,对端地址) UDP 客户端步骤如下: 1.创建待连接套接字fd=scoket() 2.发送信息sendto(fd,服务器ip和端口) UDP服务器 int main(int argc, char const *argv[]) { // 创建一个UDP套接字 int fd = Socket(AF_INET,

m0_67391401的博客 672
上一篇: 解决Detours编译报错(在Win10+vs2015开发环境下)
下一篇: Android系统OTG_usb链接摄像头的驱动和使用
墨迹流韶
博客等级 码龄12年 3粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值