进一步阅读

进一步阅读

我有4个程序,将来会增加,这些程序必须连接到相同的ip:port来同时发送和接收消息。

到目前为止,我已经打开了套接字,我还想保持程序和服务器之间的连接处于活动状态。

#!/bin/sh
nc -lvk 88.109.110.161 100 > port100.txt 2>&1

答案1

nc不能并行处理多个连接的客户端,并且是不适合这项工作的工具。有很多适合这项工作的工具,包括:

  1. Bernstein 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/
  2. 我的tcpserver垫片:
    tcpserver -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  3. 我的 UCSPI-TCP 工具:
    tcp-socket-listen 88.109.110.161 100 tcp-socket-accept --verbose sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  4. 贝尔科特s6-tcpserver4
    s6-tcpserver4 -v 2 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  5. Bercot s6-网络工具:
    s6-tcpserver4-socketbinder 88.109.110.161 100 s6-tcpserver4d -v 2 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  6. 帕普tcpsvd
    tcpsvd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  7. 桑普森onenetd
    onenetd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/

并且可以用multilogs6-logsvlogdtinylog代替cyclog

进一步阅读

答案2

真正遗憾的是,没有标准/现成的工具来完成这样的基本任务,但如果您不在某些嵌入式系统上并且有一些类似perlpython可用的脚本语言,您可以快速将一些东西放在一起:

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'

相关内容