私は同時にメッセージを送受信するために同じIP:ポートに接続する必要がある4つのプログラムを持っており、今後さらに提供される予定です。
これまでソケットを開いて、プログラムとサーバー間の接続もアクティブに保ちたいです。
#!/bin/sh
nc -lvk 88.109.110.161 100 > port100.txt 2>&1
答え1
nc
接続されている複数のクライアントを並列に処理することはできず、操作に適したツールではありません。次のような作業に適したさまざまなツールがあります。
- Bernstein
tcpserver
(オリジナルまたはdjbwares)またはHoffmantcpserver
:tcpserver -v -R -H -l 0 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 | cyclog port100/
- 私の
tcpserver
スペーサー:tcpserver -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 | cyclog port100/
- 私のUCSPI-TCPツール:
tcp-socket-listen 88.109.110.161 100 tcp-socket-accept --verbose sh -c 'exec cat 1>&2' 2>&1 | cyclog port100/
- ベルコート
s6-tcpserver4
:s6-tcpserver4 -v 2 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 | cyclog port100/
- Bercot s6 - ネットワークツール:
s6-tcpserver4-socketbinder 88.109.110.161 100 s6-tcpserver4d -v 2 sh -c 'exec cat 1>&2' 2>&1 | cyclog port100/
- パプフ
tcpsvd
:tcpsvd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 | cyclog port100/
- サムソン
onenetd
:onenetd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 | cyclog port100/
そして、、multilog
またはで置き換えることができます。s6-log
svlogd
tinylog
cyclog
追加読書
- 規約:
- ジョナサンデボインポラード(2016)。UNIXクライアント - サーバープログラミングインターフェースのgen。よく与えられる答えです。
- バーンスタイン、ダニエル(1996)。UNIXクライアント - サーバープログラムインターフェース。 cr.yp.to.
- ツールセット:
- ダニエルJ.バーンスタイン。ucspi TCPプロトコル。 cr.yp.to.
- アービン・ホフマン。 ucspi-tcp6。 fehcom.de.
- s6ネットワーク。 Laurent Bercot.skarnet.org.
- ジョナサンデボインポラード(2019)。おやつ。 ソフトウェア。
- ジョナサンデボインポラード(2019)。DJBウェア。 ソフトウェア。
- ipsvd。 Gerrit Papp.smarden.org.
- おね。アダム・サムソン.offog.org.
- 参考書:
- ダニエルJ.バーンスタイン。
tcpserver
プログラム。 ucspi-tcp。 - アービン・ホフマン。
tcpserver
。 ucspi-tcp6。 fehcom.de. s6-tcpserver4
。ローランベルコ。 s6ネットワーク。 skarnet.org.tcpsvd
。 ipsvd。 Gerrit Papp.smarden.org.- ジョナサンデボインポラード(2019)。
tcpserver
。 DJBウェア。ソフトウェア。 - ジョナサンデボインポラード(2019)。
tcp-socket-listen
。 スナックガイド。ソフトウェア。 - ジョナサンデボインポラード(2019)。
tcp-socket-accept
。 スナックガイド。ソフトウェア。 - ジョナサンデボインポラード(2019)。
tcpserver
。 スナックガイド。ソフトウェア。
- ダニエルJ.バーンスタイン。
- 記録:
答え2
これらの基本的な作業のための標準/既知のツールがないことは本当に残念ですが、組み込みシステムを使用せずに類似または使用可能なスクリプト言語がある場合は、すばやく一緒にperl
使用python
できます。
tcpsrv:
#! /usr/bin/perl
use strict;
use IO::Socket::INET6;
die "usage: $0 host:port { shell_cmd | cmd args ... }\n" unless @ARGV >= 2;
my $h = shift;
my $s=new IO::Socket::INET6(ReusePort=>1, Listen=>6, LocalAddr=>$h)
or die "IO::Socket::INET($h): $!";
warn "listening on ", $s->sockhost, "/", $s->sockport, "\n";
$SIG{CHLD} = sub { use POSIX qw(WNOHANG); 1 while waitpid(-1, WNOHANG) > 0 };
while(1){
my $a = $s->accept or do { die "accept: $!" unless $!{EINTR}; next };
warn "connection from ", $a->peerhost, "/", $a->peerport, "\n";
die unless defined(my $p = fork);
close($a), next if $p;
open STDIN, "<&", $a and open STDOUT, ">&", $a or die "dup: $!";
close $s and close $a or die "close: $!";
exec(@ARGV); die "exec @ARGV: $!";
}
使用法:tcpsrv host:port cmd
これは、リッスンし、host:port
クライアントが接続するたびにその接続から標準入力と標準出力のリダイレクトを分岐してhost:host
実行します。cmd
tcpsrv :9999 ls .
tcpsrv 127.0.0.1:7000 uptime
tcpsrv [::]:7000 uptime
tcpsrv 88.109.110.161:2000 'cat > port2000.txt'