当我尝试在嵌入式 Linux 板上使用 netcat 发送 UDP 数据包时,“连接被拒绝”

当我尝试在嵌入式 Linux 板上使用 netcat 发送 UDP 数据包时,“连接被拒绝”

我正在尝试通过 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 侦听器进程所基于的:

  1. socket__geeksforgeeks_udp_server_GS_edit_GREAT.c
  2. socket__geeksforgeeks_udp_client_GS_edit_GREAT.c

参考

  1. 我的问题下的评论。
  2. netcat 有很多版本:Netcat - 如何使用 IPv6 地址监听 TCP 端口?
  3. 这个答案,以及我的评论:UDP 接收错误:连接被拒绝

也可以看看

  1. 我的回答是一般netcat( nc)使用说明,包括设置接收时绑定的IP地址,或发送时设置发送到的IP地址

相关内容