나는 동시에 메시지를 보내고 받기 위해 동일한 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'