Linux下利用shell简单调试udp和tcp

背景

Linux环境下,有时候需要简单地进行下udp和tcp的测试,又不想去写C之类的代码,可以尝试下用Python或者直接用Shell来处理,简单方便,高效快捷。这里主要讲讲使用Shell的方式。

  • 服务端主要使用 nc (netcat) 。
  • 客户端主要使用/dev/tcp/dev/udp

nc: — arbitrary TCP and UDP connections and listens

The nc (or netcat) utility is used for just about anything under the sun
involving TCP, UDP, or UNIX-domain sockets. It can open TCP connections,
send UDP packets, listen on arbitrary TCP and UDP ports, do port scan‐
ning, and deal with both IPv4 and IPv6.

/dev/(tcp|udp)

虽然:/dev/(tcp|udp) 看起来很像一个文件系统中的文件,并且位于 /dev 这个设备文件夹下
但是:这个文件并不存在,而且并不是一个设备文件。
是一个 bash 的 一个特性。可以看官方说明:https://www.gnu.org/software/bash/manual/bash.html

/dev/(tcp|udp)/host/port

If host is a valid hostname or Internet address, and port is an integer port number or service name, Bash attempts to open the corresponding (tcp|udp) socket.

下面来看看具体的实现方式,以下方案都亲测有效!

服务端

使用 nc (netcat) 命令创建一个简单的 TCP /UDP服务器

TCP

#!/bin/bash
# 定义监听的端口号
port=12345
# 创建一个简单的 server,监听指定的端口,并打印接收到的信息
while true; do
nc -l $port | while IFS= read -r line; do
echo "$line"
done
done

UDP

UDP服务端就是nc-u参数

#!/bin/bash
# 定义监听的端口号
port=12345
# 创建一个简单的 server,监听指定的端口,并打印接收到的信息
while true; do
nc -u -l $port | while IFS= read -r line; do
echo "$line"
done
done

客户端

TCP

tcp是使用/dev/tcp

echo "hello" > /dev/tcp/127.0.0.1/12345

UDP

udp使用/dev/tcp

echo "hello" > /dev/udp/127.0.0.1/12345

扩展 – 进制与字符串处理

发送十六进制数据:

echo "07E8011A" | xxd -r -p > /dev/udp/127.0.0.1/12345

xxd命令:

make a hexdump or do the reverse.
xxd creates a hex dump of a given file or standard input. It can also
convert a hex dump back to its original binary form. Like uuencode(1)
and uudecode(1) it allows the transmission of binary data in a `mail-
safe’ ASCII representation, but has the advantage of decoding to stan‐
dard output. Moreover, it can be used to perform binary file patching.

参考