Skip to main content

Command Palette

Search for a command to run...

如何在Linux命令行下发送和接收UDP数据包

Updated
2 min read
如何在Linux命令行下发送和接收UDP数据包

众所周知,在传输层有两个常用的协议 TCP 和 UDP,本文介绍在 Linux 命令行下,如何使用 nc 命令发送或接收 UDP 数据包,这些命令的用法对调试 UDP 通信程序将有所帮助,本文适合初学者阅读。

1. 问题的提出

编写了一个使用 raw socket 在数据链路层接收原始 UDP 数据包的程序,调试的时候,需要使用局域网中的另一台机器发送 UDP 数据包,突然发现居然一下子想不出如何在命令行上发送数据包;首先想到的是用 curl,但又一想不对,curl 只能使用应用层协议透过 TCP 协议发送数据包,所以可以发 HTTP 请求包,FTP 请求包等,是不能发送 UDP 数据包的。

终于想起了不怎么使用的 nc 命令,可以很方便地发送 UDP 数据包

2. 文章要点

  1. 理解 Linux 下的 nc 命令;
  2. 使用 nc 命令在网络上发送或接收 UDP 报文;
  3. 抓取 nc 命令发送的 UDP 报文;
  4. 介绍其它可以发送 UDP 报文的命令。

3. netcat 命令

  • nc 是 netcat 的简写,大多数的 Linux 发行版中默认是安装 netcat 的,打开一个终端窗口(ctrl+alt_t),用下面命令检查一下是否已经安装了 netcat:
    nc
    
  • 在 ubuntu 20.04 下的输出:
    usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
              [-m minttl] [-O length] [-P proxy_username] [-p source_port]
              [-q seconds] [-s source] [-T keyword] [-V rtable] [-W recvlimit] [-w timeout]
              [-X proxy_protocol] [-x proxy_address[:port]]       [destination] [port]
    
  • 这个输出表示当前的 Linux 下已经有 nc 命令了。

4. 发送 UDP 数据包

  • 举个例子,假定我们要从 A 机发送一个 UDP 报文到 B 机,按照 server-client 的概念,我们把 B 机作为 server 端,A 机作为 client 端;

    Server-client方式连接的两台机器

  • A 机的 IP: 192.168.2.112;B 机的 IP:192.168.2.114

  • 启动 server

    • 在 B 机上用如下命令启动 Server
      nc –u –l 8888
      
    • 下面是屏幕截图

      在B机用nc启动服务器监听

    • 启动后,并没有更多的提示,当收到信息时,会显示收到的信息

  • 检查 server 是否启动

    • 在 B 机上启动一个新的终端窗口;
    • 在 B 机上使用如下命令检查是否已经启动 server;
      netstat -a|grep 8888
      
    • 屏幕截图

      检查server是否启动

  • 发送 UDP 报文

    • 在 A 机上启动 client
      nc -n 192.168.2.114 8888
      
    • client 启动后,和 server 端一样,并没有更多的提示,可以直接输入你要发出的信息
    • 在 A 机输入信息:I am from ubuntu system A.
    • 下面是 A 机上的屏幕截图

      在client端发送信息

    • 下面是 B 机上的屏幕截图

      在server端接收信息

    • 也可以在 B 机输入信息,信息会发送到 A 机

    • 在 B 机输入信息:I am from ubuntu system B.
    • 下面是在 B 机的截图

      在server端发送信息

    • 下面是在 A 机的截图

      在client端接收信息

5. 其它可以发送 UDP 数据包的命令

  • 还有一个可以简单地发送 UDP 报文的方法,我们在 A 机上退出 nc,然后使用下面命令发出信息
    echo -n "I am sending an UDP packet using echo command" > /dev/udp/192.168.2.114/8888
    
  • 下面是在 A 机上的截屏

    使用echo发送UDP报文

  • 下面是在 B 机上的截屏

    接收使用echo发送的UDP报文

  • 很显然使用 cat 命令也可以发送 UDP 报文:

    使用cat命令发送UDP报文

    接收使用cat命令发送的报文

欢迎订阅 『网络编程专栏』


欢迎访问我的博客:https://whowin.cn

email: hengch@163.com

donation

500 views

More from this blog

双向链表及如何使用GLib的GList实现双向链表

双向链表是一种比单向链表更为灵活的数据结构,与单向链表相比可以有更多的应用场景,本文讨论双向链表的基本概念及实现方法,并着重介绍使用GLib的GList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助学习基于GLib编程的读者较快地掌握GList的使用方法,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;本文适合初学者阅读。 1 双向链表及其实现 在文章《单向链表以及如何使用GLib中的GSList实现单向链表》中,介绍了单向链表以及基于 G...

Oct 29, 20245 min read24
双向链表及如何使用GLib的GList实现双向链表

C程序员应该知道的最好的8个c编程框架

C 编程框架是开发人员必不可少的工具,编程框架可以为构建强大且性能优异的应用程序提供结构化的基础,本文将对 8 个最佳 C 编程框架和库做出简要的介绍,如果您正在寻找适合初学者的 C 编程框架或旨在进行 C 编程框架比较,相信本文可以给您一定的帮助。 顶级 C 编程框架 – 概述 本文将介绍以下 8 个 C 语言编程框架: 序号框架名称主要特点易于集成下载链接 1GTK全面的小部件集,跨平台支持中等的下载 2Qt跨平台支持,集成开发环境中等的下载 3CMocka轻量级,模...

Oct 19, 20244 min read36
C程序员应该知道的最好的8个c编程框架

单向链表以及如何使用GLib中的GSList实现单向链表

单向链表是一种基础的数据结构,也是一种简单而灵活的数据结构,本文讨论单向链表的基本概念及实现方法,并着重介绍使用GLib的GSList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助学习基于GLib编程的读者较快地掌握GSList的使用方法,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;本文适合初学者阅读。 1 单向链表及其实现 在文章《使用GLib进行C语言编程的实例》中,简单介绍了 GLib,建议阅读本文前先阅读这篇文章; 单向链表是一...

Aug 19, 20246 min read23
单向链表以及如何使用GLib中的GSList实现单向链表

使用GLib进行C语言编程的实例

本文将讨论使用GLib进行编程的基本步骤,GLib是一个跨平台的,用C语言编写的3个底层库(以前是5个)的集合,GLib提供了多种高级的数据结构,如内存块、双向和单向链表、哈希表等,GLib还实现了线程相关的函数、多线程编程以及相关的工具,例如原始变量访问、互斥锁、异步队列等,GLib主要由GNOME开发;本文是使用GLib编程的入门文章,旨在通过实例帮助希望学习GLib编程的读者较快地入门,本文将给出多个使用GLib库编程范例的源代码,本文程序在 ubuntu 20.04 下编译测试完成,gc...

Aug 9, 20245 min read9
使用GLib进行C语言编程的实例

Linux下使用libiw进行无线信号扫描的实例

打开电脑连接wifi是一件很平常的事情,但这些事情通常都是操作系统下的wifi管理程序替我们完成的,如何在程序中扫描wifi信号其实资料并不多,前面已经有两篇文章介绍了如何使用ioctl()扫描wifi信号,但其实在Linux下有一个简单的库对这些ioctl()的操作进行了封装,这个库就是libiw,使用libiw可以简化编程,本文介绍了如果使用libiw对wifi信号进行扫描的基本方法,本文将给出完整的源代码,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;尽...

Jul 4, 20244 min read21
Linux下使用libiw进行无线信号扫描的实例

whowin - 开源和分享是技术发展的源泉和动力

42 posts

一个从业30多年的退休程序员,主要从事嵌入式软件开发。