組み込み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(任意のインターネットネームスペースアドレス)ではなく、特定のIP(たとえば192.168.0.10)とポート(たとえば)にバインドされている場合、これはリスニングすることを意味します。10000INADDR_ANYみんなインターフェイス/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「クライアント/発信者」から)バイナリパケットを送信しようとし、そのソケットを192.168.0.10「包括」IPアドレスINADDR_ANY。その特定のIPアドレスにバインドするとは、私の受信機プロセスが聞いていないlocalhost127.0.0.1)を意味するので、これらのパケットは拒否されます!localhost同じPC上で実行されているプロセスにいくつかのデータを転送したり送信したりする以外に他のものを使用できるかどうかはわかりませんが、127.0.0.1明らかに可能です。

したがって、これはうまくいきます。

nc -w 1 -u 192.168.0.10 10000 < my_binary_packet.bin

しかし、1秒のtimeout / wait(-w 1)は何もしないようです。理由はわかりません。パケットを送信した後にそのまま再送信するには、公開Ctrl+Cプロセスを実行する必要があります。ncしかし、それは問題ではありません。ポイントはうまくいくということです!

また、私の質問にコメントを注意深く読んだので、気になる人のために以下の追加情報を提供します。

これに対応するコマンドは次のとおりです(コマンドにあることをsocat忘れないでください!)。-

socat udp:192.168.0.10:10000 - < my_binary_packet.bin

また、これはnetcat組み込みLinuxボードの私のバージョンです。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

さらに進む

netcatCまたはC ++でバイナリパケットを作成して送信または送信する方法socat

最後に、私がバイナリパケットを書く方法は、my_binary_packet.binLinuxを使ってファイルにパッケージング構造を書くCコードを書くだけです。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. ソケット__geeksforgeeks_udp_server_GS_edit_GREAT.c
  2. ソケット__geeksforgeeks_udp_client_GS_edit_GREAT.c

引用する

  1. 私の質問にコメントしてください。
  2. netcatにはいくつかのバージョンがあります。Netcat - IPv6アドレスを使用してTCPポートをリッスンする方法は?
  3. この答えと私の意見は次のとおりです。UDP受信エラー:接続が拒否されました。

また、見ることができます

  1. 私の答えはnc受信時にバインドされたIPアドレスの設定、または送信時に送信されるIPアドレスの設定など、netcat()の使用に関する一般的なガイドラインです。

おすすめ記事