次のように、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
)とポート(たとえば)にバインドされている場合、これはリスニングすることを意味します。10000
INADDR_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アドレスにバインドするとは、私の受信機プロセスが聞いていない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秒の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
さらに進む
netcat
CまたはC ++でバイナリパケットを作成して送信または送信する方法socat
最後に、私がバイナリパケットを書く方法は、my_binary_packet.bin
Linuxを使ってファイルにパッケージング構造を書く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リスナープロセスの基盤です。
引用する
- 私の質問にコメントしてください。
- netcatにはいくつかのバージョンがあります。Netcat - IPv6アドレスを使用してTCPポートをリッスンする方法は?
- この答えと私の意見は次のとおりです。UDP受信エラー:接続が拒否されました。