我正在尝试通过 netcat ( ) 将二进制数据包发送到本地进程,nc
如下所示:
nc -w 1 -u localhost 10000 < my_binary_packet.bin
输出是:
read(net): Connection refused
有人知道发生了什么事吗?
我得到相同的结果nc -w 1 -u 127.0.0.1 10000 < my_binary_packet.bin
答案1
概括
如果您的侦听器绑定到特定的 IP(例如192.168.0.10
)和端口(例如10000
)而不是 IP INADDR_ANY
(Internet 命名空间地址任意,这意味着它侦听全部接口/IP 地址),请执行此操作来指定正确的 IP:
# with netcat
nc -w 1 -u 192.168.0.10 10000 < my_binary_packet.bin
# OR (same thing), with socat
socat udp:192.168.0.10:10000 - < my_binary_packet.bin
细节
好吧,我想通了!
我编写了本地侦听器进程(UDP“服务器/侦听器”),我试图将二进制数据包发送到(从UDP“客户端/发送者”),并且我已将该套接字绑定到特定的IP地址,192.168.0.10
而不是“包罗万象”的 IP 地址INADDR_ANY
。绑定到该特定 IP 地址意味着我的侦听器进程未侦听localhost
( 127.0.0.1
),因此这些数据包被拒绝!我不知道您可以使用localhost
或以外的任何东西向在同一台 PC 上运行的进程发送一些数据127.0.0.1
,但显然您可以。
所以,这有效:
nc -w 1 -u 192.168.0.10 10000 < my_binary_packet.bin
然而, 1 秒的超时/等待时间 ( -w 1
) 似乎没有做任何事情——我不知道为什么。它只是在发送数据包后就坐在那里,如果我想再次发送它,我必须在发送后Ctrl+C处理。nc
但这并不重要——关键是:它有效!
我还仔细阅读了我的问题下的评论,因此这里为想知道的人提供了更多信息:
等效的socat
命令是这样的(不要忘记-
命令中的 !):
socat udp:192.168.0.10:10000 - < my_binary_packet.bin
另外,这是我在嵌入式 Linux 板上的netcat
版本。socat
# nc -h
GNU netcat 0.7.1, a rewrite of the famous networking tool.
# nc -V
netcat (The GNU Netcat) 0.7.1
Copyright (C) 2002 - 2003 Giovanni Giacobbi
# socat -V
socat by Gerhard Rieger and contributors - see www.dest-unreach.org
socat version 1.7.3.4 on May 6 2022 17:55:04
更进一步
如何用 C 或 C++ 构建二进制数据包以通过netcat
或发送socat
最后,对于任何想知道的人来说,我编写二进制数据包的方式my_binary_packet.bin
是简单地编写一些 C 代码,使用 Linux 将打包结构写入文件write()
命令。
将数据包写入这样的二进制文件可以通过netcat
或轻松进行测试socat
,这促使我在它不起作用时提出这个问题。
打开文件时请务必设置文件权限。前任:
int file = open("my_binary_packet.bin", O_WRONLY | O_CREAT, 0644);
这是结构定义的样子。该my_binary_packet.bin
文件实际上只包含该二进制数据包内该结构的逐字节副本,后我为结构体的每个成员设置了特定的、必需的值:
struct __attribute__((__packed__)) my_packet {
bool flag1;
bool flag2;
bool flag3;
};
完整代码打开文件、创建数据包并将二进制数据包写入文件可能如下所示:
typedef struct __attribute__((__packed__)) my_packet_s {
bool flag1;
bool flag2;
bool flag3;
} my_packet_t;
int file = open("my_binary_packet.bin", O_WRONLY | O_CREAT, 0644);
if (file == -1)
{
printf("Failed to open. errno = %i: %s\n", errno, strerror(errno));
return;
}
my_packet_t my_packet =
{
.flag1 = true,
.flag2 = true,
.flag3 = true,
};
ssize_t num_bytes_written = write(file, &my_packet, sizeof(my_packet));
if (num_bytes_written == -1)
{
printf("Failed to write. errno = %i: %s\n", errno, strerror(errno));
return;
}
int retcode = close(file);
if (retcode == -1)
{
printf("Failed to close. errno = %i: %s\n", errno, strerror(errno));
return;
}
对于任何想要学习如何使用 C 或 C++ 编写 Berkeley 套接字的人...
我在我的文章中写了这个非常详尽的演示eRCAGuy_hello_world回购。此服务器代码是我的 UDP 侦听器进程所基于的:
参考
- 我的问题下的评论。
- netcat 有很多版本:Netcat - 如何使用 IPv6 地址监听 TCP 端口?
- 这个答案,以及我的评论:UDP 接收错误:连接被拒绝