Linux下 UDP 服务端和客户端回声实现

linux:UDP(用户数据报协议)1、客户端和服务器连接并通信客户端,向服务器发送数据2、实现回传。服务器收到客户端的数据之后,将数据返传给客户端 阅读详情

一.UDP协议        

        UDP是传输层的协议,它的主要作用是:将从网络中收到的数据,分配给具体的套接字的端口。UDP是一种不可靠的传输方式,提供的是不可靠的数据传输服务。

        如果只考虑可靠性,TCP比UDP好,但 UDP在结构上比TCP更简洁。 UDP不会发送类似ACK的应答消息,也不会像SEQ那样给数据包分配序号。 因此,UDP的性能 有时比TCP高出很多。 在更重视性能而非可靠性的情况下,UDP是一种很好的选择。

        TCP为了提供可靠的数据传输服务,TCP在不可靠的IP层进行流控制,而 UDP就没有这种流控制。  流控制 是区分UDP 和 TCP的最重要的标志。 TCP的生命在于流控制。 在收发数据量小但需要频繁连接时,UDP 比 TCP更高效。

二.数据IO函数

1.sendto 函数

#include<sys/socket.h>

ssize_t  sendto( int sock ,  void* buf,  size_t nbytes ,  int  flags,

                                struct sockaddr* to,    socklen_t addrlen);

成功时返回传输的字节数, 失败时返回 -1.

参数:

        sock : 用于传输数据的UDP套接字文件描述符

        buff: 保存待传输数据的缓冲地址值

        nbytes: 待传输的数据长度,以字节为单位

        flags:  可选项参数,若没有则传递0

        to :  存有目标地址信息的sockaddr 结构体变量的地址值

        addrlen: 传递给参数 to 的地址值的结构体变量长度

2. recvfrom函数

 #include<sys/socket.h>

ssize_t recvfrom(int sock,  void* buff,  size_t nbytes, int flags,

                                struct  sockaddr* from, socklen_t* addrlen);

成功时返回接受的字节数,失败时返回-1.

参数:

        sock : 用于传输数据的UDP套接字文件描述符

        buff: 保存待传输数据的缓冲地址值

        nbytes: 可接收的最大字节数,无法超过参数buff所指的缓冲大小

        flags:  可选项参数,若没有则传递0

        to :  存有发送地址信息的sockaddr 结构体变量的地址值

        addrlen: 保存参数 from 的结构体变量的变量地址值

三.代码实现

udp不同于tcp,不存在请求连接 和 受理过程,因此在某种意义上无法明确区分 服务器端和客户端。只是因其提供服务而称为服务器端。

运行过程中顺序并不重要,只需要保证在调用 sendto函数前, snedto 函数的目标主机程序已经开始运行。

1.server端:

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

#define BUF_SIZE 30

void error_handling(char* message);

int main(int argc , char* argv[])
{
    int serv_sock;
    char message[BUF_SIZE];
    int str_len;
    socklen_t clnt_adr_sz;
    struct sockaddr_in serv_adr, clnt_adr;

    if(argc!=2)
    {
        printf("Usage:%s<port>\n",argv[0]);
        exit(1);
    }
    serv_sock = socket(PF_INET,SOCK_DGRAM,0);

    if(serv_sock == -1)
    {
        error_handling("UDP socket creation error");
    }

    memset(&serv_adr,0,sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)
        error_handling("bind() error");

    while(1)
    {
        clnt_adr_sz = sizeof(clnt_adr);
        str_len = recvfrom(serv_sock,message,BUF_SIZE,0,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);
        message[str_len] = 0;
        printf("Message from clinet:%s\n",message);
        sendto(serv_sock,message,str_len,0,(struct sockaddr*)&clnt_adr,clnt_adr_sz);

    }

    close(serv_sock);

    return 0;
}

void error_handling(char* message)
{
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}

2.client 端:

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

#define BUF_SIZE 30
void error_handling(char* message);

int main(int argc, char* argv[])
{
    int sock;
    char message[BUF_SIZE];
    int str_len;
    socklen_t adr_sz;

    struct sockaddr_in serv_adr,from_adr;

    if(argc!=3)
    {
        printf("Usage:%s<IP><port>\n",argv[0]);
        exit(1);
    }

    sock = socket(PF_INET,SOCK_DGRAM,0);

    if(sock == -1)
        error_handling("socket() error");
    
    memset(&serv_adr,0,sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_adr.sin_port = htons(atoi(argv[2]));

    while(1)
    {
        fputs("Insert message(q to quit):",stdout);
        fgets(message,sizeof(message),stdin);
        if(!strcmp(message,"q\n")|| !strcmp(message,"Q\n"))
            break;
        
        sendto(sock,message,strlen(message),0,(struct sockaddr*)&serv_adr,sizeof(serv_adr));

        adr_sz = sizeof(from_adr);
        str_len = recvfrom(sock,message,BUF_SIZE,0,(struct sockaddr*)&from_adr,&adr_sz);

        message[str_len]=0;
        printf("Message from server:%s",message);
    }
    close(sock);

    return 0;
}
void error_handling(char* message)
{
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}

3.执行的结果: 

以太网UDP数据回环实验 上位机通过网口调试助手发送数据给FPGA,FPGA通过以太网接口接收数据并将收到的数据发送给上位机,完成以太网UDP数据的回环。 阅读详情

相关推荐

能够接收响应的UDP客户端及TCP&UDP同步场景下的请求处理

前言 客户的需求真是千奇百怪 最近有个需求, 内网内有一批数据不太对, 需要通过UDP将数据发送至外网, 外网程序处理后同样也以UDP方式返回. 在此过程中需要同步阻塞, 即内网程序要一直等待外网程序的数据返回, 才进行下一步动作. (效率可想而知 -_-) 这里的程序为内网程序 设计 由于程序不止要发送udp, 还要接受返回消息, 所以这边采用netty实现UdpClient 同步方式采用wait及LockSupport辅助处理 udp是不保证交付的, 所以添加了超时处理器, 一定时间内没有收到返回消息

lvmuheng的博客 799

网络套接字(UDP和TCP编程)

无连接:UDP双方在发送数据之前,是不需要进行沟通的,只需要知道对方的ip和端口就好i(对方进程可能没有准备好)就可以发送。主机字节序:主机本身的字节序,如果是大端,则主机字节序为大端,如果是小端,则主机字节序为小端。面向字节流:1.对于传输的数据没有明显的边界 2.对于接受方而言,可以按照任意的字节进行接收。已完成连接队列:连接已经建立,可以正常通信的连接放在这个队列(三次握手已经完毕的连接)未完成连接队列:还处于连接建立过程的连接被仿真这个队列当中(正在三次握手的连接)...

m0_58103115的博客 921

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下...

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下 CT Image with Window presets This is an example of displaying a ct image along with buttons to set ww/wc pres...

浩秦的博客 1841

LINUX 下通过UDP端口发送命令以及接收反馈的代码

#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdl...

mcupro的专栏 1377

2024.6.10丨基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释指南

本文详细介绍了基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释方法,涵盖工具安装、参数优化、数据库选择及实战案例解析。通过DIAMOND的快速比对和VFDB的全面毒力因子数据,显著提升微生物基因组研究效率,适用于临床检测、食品安全监测等多个场景。

weixin_33712987的博客 376

初学树莓派——(九)DHT11数据传入ONENET

目录 前言 DHT11实现本地温湿度监测 DHT11.py 接线图 效果图 温湿度数据上传至ONENET 新建产品 新建设备 ONENET.py 测试 Shell脚本配置 效果图 前言 本文分部分实现温湿度上传至OneNet云平台,本地数据监测,数据上传 新建一个文件夹,文件夹内包含DHT11.py、ONENET.py、tmp_data.txt、hum_data.txt DHT11实现本地温湿度监测 DHT11.py import RPi.GPIO as GPIO

会点灯的大力水手的博客 2612

Linux下UDP回声服务器的实现

首先我们需要了解一下UDP和TCP的区别 TCP面向连接数据的传输方式有三个特点: A、传输的过程数据不会丢失 B、按顺序传输 C、传输的过程中不存在数据边界 TCP协议是面向连接的套接字:可靠的、按序传递的、基于字节的面向连接的数据传输方式的套接字。 UDP数据的传输方式有四个特点: A、强调快速传输而非传输顺序 B、传输的数据可能丢失也可能损毁 C、传输的过程中不存在数据边界 D、限制每次传输的数据大小 UDP协议是面向消息的套接字:不可靠的、不按序传递的、以数据的高速传输位目的的套接字。 UDP回声服

Lavender的博客 490

电流采样电路设计:差分放大与ADC采集详解

在电机控制、电源管理、电池监测等应用中,电流采样是一个关键环节。通常,我们使用小阻值的采样电阻将电流信号转换为电压信号,再通过运放放大后送入ADC进行采集。本文将详细分析一种基于差分放大器的电流采样电路,包括信号放大、参考电压偏置、滤波保护以及ADC转换计算等内容。

W0s477的博客 2万+

【Linux网络】网络编程套接字(预备知识+UDP)

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及UNIX Domain Socket。然而,各种网络协议的地址格式并不相同。

gtyyky的博客 1603

innovus:sroute 双层follow pin的做法

根据std cellpower pin的层次可以分成两种情况。

m0_61544122的博客 2732

C# HttpClient完全攻略:从入门到精通只需5步

HttpClient是.NET框架中用于发送HTTP请求和接收HTTP响应的类。它基于异步编程模型,使得网络操作更加高效和灵活。

java专栏 1579

《TCP/IP网络编程》第6章 笔记&代码&注释

基于UDP的回声迭代客户端&amp;服务端代码: 在Linux和Windows里,recvfrom()和sendto()函数并无太大区别。 对比recvfrom() 和 recv(),recvfrom()多了两个参数用来接收对端的地址信息,这对于UDP无连接可以方便的进行回复; send()和sendto()同理。 在代码中,服务器端使用sendto()是因为其socket并无与客户端建立...

ChristmasError的博客 248

Spark中Application、Job、Stage和Task区别详解

在Spark中,有一些关键的概念,如Application、Job、Stage和Task,它们描述了Spark作业的不同层次和组成部分。下面我将详细介绍每个概念,并通过示例说明它们之间的区别。

优快云 精品推荐 904

【Linux】基于Udp的简易服务端和客户端

介绍了一些简单的udp服务器程序

博主在编程学习中的总结、笔记 2008

Autosar模式管理入门系列02-EcuM

对EcuM状态机切换过程及模块中重要API进行介绍。

initiallizer的博客 7093

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux网络编程之UDP 回声服务器与客户端

Linux网络编程之UDP 回声服务器与客户端:这个Demo主要演示了如何在Linux环境下使用UDP协议实现一个简单的回声服务器(Echo Server)以及与之对应的客户端应用程序。

qq_44846784的博客 4531

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

socket编程二十六:基于UDP的服务器端和客户端

前面的文章中我们给出了几个 TCP 的例子,对于 UDP 而言,只要能理解前面的内容,实现并非难事。 UDP中的服务器端和客户端没有连接 UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程。也就是说,不必调用 listen() 和 accept() 函数。UDP 中只有创建套接字的过程和数据交换的过程。 UDP服务器端和客户端均只需1个套接...

baidu_15547923的博客 2796

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

基于UDP的服务器端/客户端

理解UDPUDP套接字的特点下面通过信件说明UDP的工作原理。寄信前先在信封上填好寄信人和收信人的地址,之后贴上邮票放进邮筒即可。无法确认对方是否收到信件,并且在邮寄过程中可能发生信件丢失的情况。也就是说,UDP是不可靠的数据传输服务。TCP为了提供可靠的数据传输服务,在不可靠的IP层进行流控制,所以TCP比UDP可靠,但UDP在结构上比TCP更简洁。流控制是区分UDP和TCP的最重要的标志。UD...

amoscykl的博客 6595

基于UDP的服务器端和客户端

前面的文章中我们给出了几个 TCP 的例子,对于 UDP 而言,只要能理解前面的内容,实现并非难事。 UDP中的服务器端和客户端没有连接 UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程。也就是说,不必调用 listen() 和 accept() 函数。UDP 中只有创建套接字的过程和数据交换的过程。 UDP服务器端和客户端均只需1个套接...

wang13342322203的博客 2657

Linux 网络编程(四)——基于UDP的服务器端/客户端

4 基于UDP的服务器端/客户端 4.1 UDP套接字的特点 4.2 UDP协议适用场景 4.3 基于UDP数的I/O函数 4.4 基于UDP的回声服务器端/客户端 4.5 UDP的数据传输特性 4.6 已连接UDP套接字与未连接UDP套接字(可略过)

m0_60875396的博客 764

Linux 网络套接字编程(二)从 0 到 1 实现 UDP 回声服务器,recvfrom,sendto

本文基于C++实现了一个UDP回声服务器,通过构建完整的客户端/服务端通信模型,将Socket网络编程理论转化为实践。服务端采用面向对象设计,封装了socket创建、端口绑定、数据收发等核心功能,支持多网卡监听;客户端主动发起通信,由系统自动分配临时端口。文章详细解析了UDP无连接通信的特点、IP与端口的作用机制,以及内核缓冲区的工作流程,并通过本地回环、内网和公网三种场景验证了程序功能。代码实现了服务端对客户端消息的原样回显,展示了UDP协议"发什么回什么"的核心逻辑,为后续网络编程学

2401_88465894的博客 775

简易回声服务器实现与网络测试指南

本文介绍了基于UDP协议实现的回声服务器系统。通过服务端和客户端的完整实现,解决了网络通信中客户端无法确认服务端是否成功接收数据的问题。服务端在接收数据后会原样返回给客户端,使通信状态可视化。文章详细讲解了UDP套接字编程的关键技术点,包括socket、bind、recvfrom、sendto等系统调用的使用,以及IP地址转换、字节序处理等网络编程基础。同时提供了代码优化建议、静态编译方法和部署指南,帮助开发者构建可靠高效的UDP通信应用。

祯的博客 1125

TCP/UDP底层实现(c实现)の一

针对c语言的一个tcp/udp的简单流程总结

jack的博客 3198

Linux环境编程 基于UDP通信协议的回声服务器

套接字(Socket) socket是一种可以进行网络通信的内核对象,它有一个唯一的标识符,一般称它为socket描述符——sockfd,可类比于文件描述符fd,基于Linux下一切皆文件的概念,所以sockfd也可以用read/write/close操作。 socket函数:创建socket对象 int socket(int domain, int type, int protocol); domain:通信地址类型   AF_UNIX/AF_LOCAL:本地进程间通信   AF_INET:使用ipv

Wangsir1122的博客 378

Linux网络编程 - 基于UDP的服务器端/客户端

一 理解UDP 1.0 UDP协议简介 UDP(User Datagram Protocol,用户数据报协议) [RFC 768] UDP协议的数据传输单元叫 UDP用户数据报,而TCP协议的数据传输单元叫 TCP报文段(segment)。 UDP在传送数据前不需要先建立连接。远地主机的运输层在收到UDP报文段后,不需要给出任何确认。虽然UDP不提供可靠交付服务,但在某些情况下却是一种最有效的工作方式。 下图给出了一些应用和应用层协议主要使用的运输层协议(UDP和TCP)。 图1-1 使用U.

yunfan 3439
上一篇: 同步阻塞IO 和 IO多路复用
下一篇: C++中的Lambda表达式
Monkey Ji
博客等级 码龄9年 113粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值