我有4个程序,将来会增加,这些程序必须连接到相同的ip:port来同时发送和接收消息。
到目前为止,我已经打开了套接字,我还想保持程序和服务器之间的连接处于活动状态。
#!/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 网络。洛朗·贝尔科特. skarnet.org。
- 乔纳森·德博因·波拉德 (2019)。开胃菜。 软件。
- 乔纳森·德博因·波拉德 (2019)。DJBwares。 软件。
- ipsvd。格里特·帕普. smarden.org。
- 奥内特。亚当·桑普森. offog.org。
- 参考手册:
- 丹尼尔·J·伯恩斯坦。该
tcpserver
程序。 ucspi-tcp。 - 埃尔文·霍夫曼。
tcpserver
。 ucspi-tcp6。 fehcom.de。 s6-tcpserver4
。洛朗·贝尔科特. s6 网络。 skarnet.org。tcpsvd
。 ipsvd。格里特·帕普. smarden.org。- 乔纳森·德博因·波拉德 (2019)。
tcpserver
。 DJBwares。软件。 - 乔纳森·德博因·波拉德 (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'