首页 > 其他分享 >UDP通信

UDP通信

时间:2023-12-01 18:11:26浏览次数:104  
标签:UDP addr bytes 通信 server sockfd 接字

一、UDP概述

传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但UDP也是网络通信中不可或缺的重要通信手段。相较于TCP而言,UDP通信的形式更像是发短信。不需要在数据传输之前建立、维护连接。只专心获取数据就好。省去了三次握手的过程,通信速度可以大大提高,但与之伴随的通信的稳定性和正确率便得不到保证。因此,我们称UDP为“无连接的不可靠报文传递”。由于无需创建连接,所以UDP开销较小,数据传输速度快,实时性较强。多用于对实时性要求较高的通信场合,如视频会议、电话会议等。但随之也伴随着数据传输不可靠,传输数据的正确率、传输顺序和流量都得不到控制和保证。所以,通常情况下,使用UDP协议进行数据传输,为保证数据的正确性,我们需要在应用层添加辅助校验协议来弥补UDP的不足,以达到数据可靠传输的目的。

C/S模型-UDP

二、函数介绍

1.recvfrom函数

recvfrom 是一个用于在网络编程中接收数据的系统调用函数,通常用于无连接的 UDP(User Datagram Protocol)套接字。该函数的原型如下:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

参数说明如下:

  • sockfd:套接字文件描述符,指定发送数据的套接字。
  • buf:指向要发送数据的缓冲区的指针。
  • len:要发送的数据的长度。
  • flags:发送标志,可以用0表示默认行为。
  • dest_addr:指向目标地址结构的指针,包含目标 IP 地址和端口号。
  • addrlen:目标地址结构的长度。

2.sendto函数

sendto通常用于在无连接的 UDP(User Datagram Protocol)套接字上发送数据。该函数的原型如下:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

参数说明如下:

  • sockfd:套接字文件描述符,指定接收数据的套接字。
  • buf:指向存储接收数据的缓冲区的指针。
  • len:缓冲区的大小,即要接收的数据的最大长度。
  • flags:接收标志,可以用0表示默认行为。
  • src_addr:指向发送端地址结构的指针,用于存储发送端的地址信息。
  • addrlen:src_addr 结构的长度,同时作为输出参数,用于存储实际发送端地址结构的长度。

三、示例代码

UDP服务端示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024
#define PORT 12345

int main() {
    int sockfd;
    struct sockaddr_in server_addr, client_addr;

    // 创建 UDP 套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址信息
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);  // 设置端口号
    server_addr.sin_addr.s_addr = INADDR_ANY;  // 接收任意地址

    // 绑定套接字到本地地址
    if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    printf("Server waiting for incoming messages...\n");

    char buffer[MAX_BUFFER_SIZE];
    ssize_t bytes_received;
    socklen_t client_addrlen = sizeof(client_addr);

    // 接收数据
    bytes_received = recvfrom(sockfd, buffer, sizeof(buffer), 0,
                              (struct sockaddr *)&client_addr, &client_addrlen);
    if (bytes_received == -1) {
        perror("recvfrom");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    printf("Received %zd bytes from %s:%d\n", bytes_received,
           inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
    buffer[bytes_received] = '\0';  // 添加字符串结束符
    printf("Message: %s\n", buffer);

    // 回显消息给客户端
    if (sendto(sockfd, buffer, bytes_received, 0,
               (struct sockaddr *)&client_addr, client_addrlen) == -1) {
        perror("sendto");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}

UDP客户端示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024
#define PORT 12345

int main() {
    int sockfd;
    struct sockaddr_in server_addr;

    // 创建 UDP 套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址信息
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);  // 设置端口号
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  // 设置服务器 IP 地址

    const char *message = "Hello, server!";
    
    // 发送数据到服务器
    if (sendto(sockfd, message, strlen(message), 0,
               (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("sendto");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    printf("Message sent to the server: %s\n", message);

    char buffer[MAX_BUFFER_SIZE];
    ssize_t bytes_received;

    // 接收服务器回显的消息
    bytes_received = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);
    if (bytes_received == -1) {
        perror("recvfrom");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    buffer[bytes_received] = '\0';  // 添加字符串结束符
    printf("Received echo from server: %s\n", buffer);

    // 关闭套接字
    close(sockfd);

    return 0;
}

 

标签:UDP,addr,bytes,通信,server,sockfd,接字
From: https://www.cnblogs.com/TechNomad/p/17870663.html

相关文章

  • 无线通信中补充的一些小东西
    1、对数域与线性域经常能看到各种各样的单位类似于dBm、dBW、W、mW、dB,其实可以理解为就是换了量纲。dB其实是一个相对单位,比如说描述功率扩大了多少,或者缩小了多少,例如:功率原来为P0,现在把功率扩大100000000倍设为P1,用dB表示的话就是\(10\lg(\cfrac{P1}{P0})=80dB\),就相当于......
  • 每日一练:通过广播信道实现跨页面通信
    利用广播通道实现标签页通信1.什么是广播通道广播通道是一种新的浏览器原生API,它可以让你在同源的标签页之间传递消息。这个API的目的是为了让开发者可以在不同的标签页之间共享数据,而不需要使用LocalStorage或者其他的存储方式。2.广播通道的使用2.1创建广播通道constchannel......
  • FPGA 实现SPI 主机双工通信 CS前后肩可调 操作时钟频率可调 ,SPI模式可调,传输位宽可
    1//testbench2`timescale1ns/1ns3modulelcd_spi_m_tb();4regrst_n_i;5regspi_clkx_i;6reg[31:0]spi_data_i;7regspi_start;8regspi_miso_r1,spi_miso_r2;9wirespi_miso_i;10wire[0:0]spi_done;11wir......
  • 工业智能网关如何保障数据通信安全
    工业智能网关是组成工业物联网的重要设备,不仅可以起到数据交换、通信、边缘计算的功能,还可以发挥数据安全保障功能,保障工业物联网稳定、可持续。本篇就为大家简单介绍一下工业智能网关增强和确保数据通信安全的几种措施:1、软件算法加密以佰马工业智能网关为例,网关支持多种加密通信......
  • 2.4G SOC芯片兼容SI24R1 通信协议
       Si24R03是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在2.4GHzISM频段的无线收发器(SI24R1)模块。2.4G部分兼容nRF24系列,nRF51系列,nRF52系列芯片的2.4G空口通信协议;MCU模块具有低功耗、LowPinCount、宽电压工作范围,集成了13/14/15/16......
  • 哇塞,实测780MB/s!基于RK3568J与FPGA的PCIe通信案例详解
    ARM+FPGA架构有何种优势近年来,随着中国新基建、中国制造2025的持续推进,单ARM处理器越来越难满足工业现场的功能要求,特别是能源电力、工业控制、智慧医疗等行业通常需要ARM+FPGA架构的处理器平台来实现特定的功能,例如多路/高速AD采集、多路网口、多路串口、多路/高速并行DI/DO......
  • 自定义应用层通信协议结构消息的编码方式
    应用层通信协议设计 一、应用层通信协议概述TCP/UDP是基于字节流的传输层通信协议,对于其的编程是基于IO流编程,所谓“流”,就是没有界限的一长串二进制数据。TCP/UDP作为传输层协议,并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分。所以在业务上......
  • AM62x GPMC并口如何实现“小数据-低时延,大数据-高带宽”—ARM+FPGA低成本通信方案
    GPMC并口简介GPMC(GeneralPurposeMemoryController)是TI处理器特有的通用存储器控制器接口,支持8/16bit数据位宽,支持128MB访问空间,最高时钟速率133MHz。GPMC是AM62x、AM64x、AM437x、AM335x、AM57x等处理器专用于与外部存储器设备的接口,如:(1)FPGA器件(2)ADC器件(3)SRAM内存(4)N......
  • 计算机网络的五层(七层)协议:OSI理论上的网络通信模型,TCP/IP实际上的网络通信标准。
    计算机网络的五层(七层)协议:OSI理论上的网络通信模型,TCP/IP实际上的网络通信标准。  注:下层是为上层提供服务,下层会把数据传给上层,依赖于下层请求数据的过程:返回数据的过程:   ......
  • 在网络通信方面,有哪些新技术或趋势值得关注?
    在网络通信方面,有许多新技术和趋势值得关注。以下是一些可能对您有帮助的回答:1、5G技术:第五代移动通信技术(5G)是当前通信技术的重要发展方向。它具有高速度、低延迟、大容量等特点,可以支持更多的设备和应用,如自动驾驶、远程医疗、智能制造等。2、物联网技术:物联网技术是将各种设备......