首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux udp收发包例子

基础概念

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它不保证数据包的顺序和可靠性,但具有较低的延迟和较高的传输效率。UDP适用于对实时性要求较高的应用,如音视频传输、在线游戏等。

优势

  1. 低延迟:UDP不需要建立连接,数据包可以直接发送,减少了通信延迟。
  2. 高效率:UDP没有复杂的拥塞控制机制,传输效率高。
  3. 简单易用:UDP编程接口简单,易于实现。

类型

UDP协议本身没有类型之分,但在实际应用中,可以根据数据包的处理方式分为单播、广播和组播。

应用场景

  1. 音视频传输:如VoIP、视频会议等。
  2. 在线游戏:实时性要求高的游戏。
  3. 物联网设备通信:传感器数据传输等。

示例代码

以下是一个简单的Linux下使用C语言实现UDP收发包的例子:

发送端(sender.c)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define BUF_SIZE 30

int main(int argc, char *argv[]) {
    int send_sock;
    struct sockaddr_in send_addr;
    char buf[BUF_SIZE];

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

    send_sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (send_sock == -1) {
        perror("socket() error");
        exit(1);
    }

    memset(&send_addr, 0, sizeof(send_addr));
    send_addr.sin_family = AF_INET;
    send_addr.sin_addr.s_addr = inet_addr(argv[1]);
    send_addr.sin_port = htons(atoi(argv[2]));

    while (1) {
        printf("Enter message: ");
        fgets(buf, BUF_SIZE, stdin);
        buf[strcspn(buf, "\n")] = 0; // Remove newline character

        if (sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&send_addr, sizeof(send_addr)) == -1) {
            perror("sendto() error");
            exit(1);
        }
    }

    close(send_sock);
    return 0;
}

接收端(receiver.c)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define BUF_SIZE 30

int main(int argc, char *argv[]) {
    int recv_sock;
    struct sockaddr_in recv_addr;
    socklen_t addr_size;
    char buf[BUF_SIZE];

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

    recv_sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (recv_sock == -1) {
        perror("socket() error");
        exit(1);
    }

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

    if (bind(recv_sock, (struct sockaddr*)&recv_addr, sizeof(recv_addr)) == -1) {
        perror("bind() error");
        exit(1);
    }

    addr_size = sizeof(recv_addr);

    while (1) {
        int recv_len = recvfrom(recv_sock, buf, BUF_SIZE, 0, (struct sockaddr*)&recv_addr, &addr_size);
        if (recv_len == -1) {
            perror("recvfrom() error");
            exit(1);
        }
        buf[recv_len] = 0;
        printf("Received message: %s\n", buf);
    }

    close(recv_sock);
    return 0;
}

编译和运行

  1. 编译发送端和接收端:
代码语言:txt
复制
gcc -o sender sender.c
gcc -o receiver receiver.c
  1. 运行接收端:
代码语言:txt
复制
./receiver 8888
  1. 在另一个终端运行发送端:
代码语言:txt
复制
./sender 127.0.0.1 8888

可能遇到的问题及解决方法

  1. 端口被占用:确保使用的端口没有被其他程序占用。可以使用netstat -an | grep <port>检查端口状态。
  2. 权限问题:某些情况下,绑定低端口号(<1024)需要root权限。
  3. 网络问题:确保发送端和接收端在同一网络环境下,或者网络通畅。

参考链接

通过以上示例和解释,你应该能够理解Linux下UDP收发包的基本概念和实现方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • LinuxCentos服务器禁止udp发包防udp-flood攻击

    有的网站被恶意放上UDP发包工具攻击别人,导致流量大量流失,一般服务器只有DNS使用udp协议,其它则可禁用UDP数据包外出。...为此写了个脚本只允许目标DNS服务器的UDP数据包外出,其它UDP数据包全部拒绝,本方法仅能做到防止恶意UDP数据包发出,服务器本身做好安全设置防止被恶意放马才是王道。...#/bin/bash #Createdby http://www.2cto.com #DROP UDP Flood list=`grep nameserver /etc/resolv.conf |...awk ‘{print $NF}’` for i in $list do iptables -A OUTPUT -p udp -d $i –dport 53 -j ACCEPT done iptables...-A OUTPUT -p udp -j DROP service iptables save 未经允许不得转载:肥猫博客 » Linux/Centos服务器禁止udp发包防udp-flood攻击

    2.9K30

    盘点一款Python发包收包利器——scapy

    表示层(Presentation) 应用层 Telnet, Rlogin, SNMP, Gopher 会话层(Session) 应用层 SMTP, DNS 传输层(Transport) 传输层 TCP, UDP...,收包 可分为两种情况,用法如下: 1、只发不收 send(pkt, inter=0, loop=0, count=1, iface=N) pkt:数据包 inter:发包间隔时间 count:发包数量...iface:网卡接口名称 send(),在第三层发包,没有接收功能;send(IP(dst="www.baidu.com",ttl=2)/ICMP()) sendp(),在第二层发包,没有接收功能...sr(Ether()/IP(dst="www.baidu.com")) 2、发包且收包 sr()和sr1()都是在第三层发包,sr1表示只接收第一个回复。...现在就可以使用我们的离线数据包分析数据了: sniff(offline = "hw.pcap")#离线数据包 总结 通过上面的学习,我们对scapy算是有了一个基础性的认识了,scapy的确很强大,简单的几行命令就能实现发包收包

    2.7K20

    Linux内核UDP收包为什么效率低?能做什么优化?

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK。...但是,即便Linux内核协议栈收包效率真的很低,这是为什么?有没有办法去尝试着优化?而不是动不动就DPDK。 我们从最开始说起。...首先,UDP是无状态的,收包和发包都无需事务,协议栈对UDP的处理,从来都是单个报文粒度的,因此只需要保护唯一的socket接收队列即可,即 sk_receive_queue 。...当然,Linux内核协议栈无法摆脱这两点问题,也就回答了本文的题目中的第一个问题, “Linux内核UDP收包为什么效率低?” 。 不同的上下文异步操作同一份数据,锁是必不可少的。...,这买卖代价太大,毕竟Linux内核并非专职收包的。

    3.2K61

    Linux内核UDP收包为什么效率低?性能怎么优化(超详细讲解)

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK。...但是,即便Linux内核协议栈收包效率真的很低,这是为什么?有没有办法去尝试着优化?而不是动不动就DPDK。 我们从最开始说起。...首先,UDP是无状态的,收包和发包都无需事务,协议栈对UDP的处理,从来都是单个报文粒度的,因此只需要保护唯一的socket接收队列即可,即 sk_receive_queue 。...当然,Linux内核协议栈无法摆脱这两点问题,也就回答了本文的题目中的第一个问题, “Linux内核UDP收包为什么效率低?” 。 不同的上下文异步操作同一份数据,锁是必不可少的。...,这买卖代价太大,毕竟Linux内核并非专职收包的。

    1.9K20

    linux内核发包工具,Linux内核发包工具pktgen测试方案说明「建议收藏」

    简介 pktgen是Linux内核里包含的一个高性能发包工具,主要用来测试网络性能。一般情况下,使用pktgen就可以满足千兆网卡的测试需要。...pktgen运行在“内核态”,并不占用太多的系统资源,就可以达到非常高的发包速率。 pktgen只支持UDP发包(端口9)。...eth7收包截图 从红框中可以看出收发包是一样的,而吞吐量大概达到了9.8G以上,当然发包的大小可以自己修改,测试中如果出现丢包情况,请多测试几次看看。...eth6发包eth7收包,并且eth7发包eth6收包shell脚本 pktgen_eth6_eth7.sh #!...以上两种测试在小包情况下发包只能达到4Mpps左右,要提高发包速率,采用多核多线程处理,代码如下(仍是从eth6发包eth7收包) pktgen_multicore.sh #!

    8.6K10

    linux网络随机ip发包工具,三款常用IP发包工具介绍

    ,TCP, UDP, ICMP 或raw IPv4 和IPv6 包格式,并且可以随意在包中添加数据。...发包方法 SENDIP 可以发送NTP, BGP, RIP, RIPng, TCP, UDP, ICMP、IPv4 和IPv6 等各种格式的数据包,SENDIP 本身是以模块的方式发送各种协议的数据包,...通常发送TCP/UDP/ICMP 数据包时,都必须以IP 包进行封装,然后才可以发出去。本节我们将以TCP数据包为例进行讲述。...Modules available at compile time: ipv4 ipv6 icmp tcp udp bgp rip ntp(支持的协议类型) 通常执行格式如下: #sendip –v –...NESSUS 由两个部分组成,一部分是服务器,通常运行在POSIX 系统如LINUX/UNIX 系统中,负责扫描和***,并收集数据,另一部分是客户端,可以运行在LINUX/UNIX 系 统或WINDOWS

    4.5K20

    linux udp编程_linux中socket编程

    在前面的文件中,我们介绍了linux网络编程中与IP相关的知识和常用的函数总结,本文针对具体的UDP通信,来详细的介绍UDP通信的使用,包括UDP通信中的点对点通信,多播,广播等。...一、UDP通信中服务端和客户端的基本编程框架 与TCP相比较,UDP是面向无连接的通信方式,不需要connect、listen、accept等函数操作,不用维护TCP的连接、断开等状态。...3、关于服务端的bind操作,在存在组播,多播等多种通信方式的情况下,也还有一些需要注意的点,这个我们在下面的章节中描述 二、UDP通信的基本函数说明 在UDP中,完成一个基本的通信涉及到的几个函数如下...另一个网络接口会忽略此数据 选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP:加入或者退出一个组播组其参数为一个结构体 使用组播的一个基本编程流程如下: 3.3 使用组播的服务端和客户端例子...(TBD) 三、UDP中广播的使用 UDP广播与普通的UDP通信区别不是很大,如果需要发送广播消息时,只需要在创建完socket后,配置一下套接字,允许进行发送广播消息,上代码 int set_broadcast

    11.1K10

    【Linux】:传输层协议 UDP

    UDP 协议端格式 16 位 UDP 长度:表示整个数据报 (UDP 首部+UDP 数据) 的最大长度 如果校验和出错, 就会直接丢弃; 现在我们有两个问题,UDP 是 如何做到解包和分用的,按照上面的逻辑...解包:UDP 直接读取报文前 8 个字节(16 位源端口号)来进行解包 分用: UDP 根据16位端口号去 OS 中查找进程与这16位端口号关联的 从这就可以知道我们在 Socket编程应用层UDP...UDP 缓冲区 UDP 没有真正意义上的 发送缓冲区. 调用 sendto 会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作; UDP 具有接收缓冲区....但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致; 如果缓冲区满了, 再到达的 UDP 数据就会被丢弃; UDP 的 socket 既能读, 也能写, 这个概念叫做 全双工...UDP 使用注意事项 我们注意到:UDP 协议首部中有一个 16 位的最大长度,也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部),然而 64K 在当今的互联网环境下, 是一个非常小的数字

    11610

    Linux| |对于UDP的学习

    端口 https服务器,使用443端口 操作系统动态分配的端口号 客户端服务器的端口号,这个范围的端口号操作系统可以对其进行分配 查看端口号 less /etc/services //就可以查看Linux...协议 UDP协议端格式 插图:UDP协议端格式 16为UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度(64KB) 检验和:如果校验和出错,就会直接丢弃(检验的是把首部和数据部分一起都检验...,数据传输效率高 面向数据报 应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并 例:用UDP传输100个字节的数据 如果发送端调用一次sendto,发送100个字节。...但是这个接收缓存区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓存区满了,在到达的UDP数据就会被丢弃 UDP的Socket既能读,也能写,全双工 UDP的使用注意事项 UDP协议首部中有一个...16位的最大长度,也就是说一个UDP能传输的数据的最大长度是64K(包含UDP首部)。

    3.1K30

    Linux| |对于UDP的学习

    端口 https服务器,使用443端口 操作系统动态分配的端口号 客户端服务器的端口号,这个范围的端口号操作系统可以对其进行分配 查看端口号 less /etc/services //就可以查看Linux...协议 UDP协议端格式 插图:UDP协议端格式 ?...,数据传输效率高 面向数据报 应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并 例:用UDP传输100个字节的数据 如果发送端调用一次sendto,发送100个字节。...但是这个接收缓存区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓存区满了,在到达的UDP数据就会被丢弃 UDP的Socket既能读,也能写,全双工 UDP的使用注意事项 UDP协议首部中有一个...16位的最大长度,也就是说一个UDP能传输的数据的最大长度是64K(包含UDP首部)。

    2.8K20
    领券