私は4つのプログラムを持っていますが、将来的に増加します。これらのプログラムは、メッセージを同時に送受信するために同じip:portに接続する必要があります。
今まではソケットを開いていましたが、プログラムとサーバーの間の接続を維持したいと思っています。
#!/bin/sh
nc -lvk 88.109.110.161 100 > port100.txt 2>&1
nc
は、接続されている複数のクライアントを並行して処理しないため、このジョブには不適切なツールです。この仕事には、次のような適切なツールがたくさんあります。
tcpserver
(オリジナルまたはdjbwares)またはHoffman tcpserver
: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/
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/
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
の代わりにsvlogd
、s6-log
、tinylog
、またはcyclog
を使用できます。
tcpserver
プログラム。 ucspi-tcp。tcpserver
。 ucspi-tcp6。 fehcom.de。s6-tcpserver4
。ローラン・バーコット。 s6-networking。 skarnet.org。tcpsvd
。 ipsvd。 Gerrit Pape smarden.org。tcpserver
。 djbwares。ソフトウェア。tcp-socket-listen
。 noshガイド。ソフトウェア。tcp-socket-accept
。 noshガイド。ソフトウェア。tcpserver
。 noshガイド。ソフトウェア。このような基本的なタスクに標準的ですぐに利用できるツールがないのは本当に残念ですが、組み込みシステムを使用しておらず、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
に接続するときはいつでも、そのstdinとstdoutが接続との間でリダイレクトされてcmd
をフォークおよび実行します。
tcpsrv :9999 ls .
tcpsrv 127.0.0.1:7000 uptime
tcpsrv [::]:7000 uptime
tcpsrv 88.109.110.161:2000 'cat > port2000.txt'