연결을 수락한 다음 모든 입력을 제거하는(테스트 도구에서 사용하기 위해) TCP 수신기를 구현하려고 합니다.
지금은 사용하고 있지만 socat - tcp-listen:2003,fork,reuseaddr
입력이 stdout에 인쇄됩니다. 나는 그것을 원하지 않습니다.
/dev/null
현재 위치에 있기 때문에 출력을 다음으로 리디렉션할 수 없습니다.알파인/소캣 도크 컨테이너이며 실제로 셸을 사용하지 않으므로 리디렉션이 작동하지 않습니다.
을 사용하려고 하면 socat /dev/null tcp-listen:2003,fork,reuseaddr
모든 연결이 즉시 끊어집니다. 아마도 socat
읽을 수 없기 때문일 것입니다 /dev/null
.
모든 것을 바닥에 떨어뜨리는 TCP 수신기를 구현하는 가장 좋은 방법은 무엇입니까?
답변1
socat /dev/null,ignoreeof tcp-listen:2003,fork,reuseaddr
답변2
최적이라는 것은 까다로운 기준이지만 이를 위해서는 Microsoft Excel만큼 Docker가 필요하다는 것을 알 수 있습니다. ☺
우리는 이미 EOF까지 입력을 읽고 이를 효과적으로 삭제하는 Unix 프로그램을 알고 있습니다.
고양이 > /dev/null
이를 TCP 서버로 변환하는 것은 매우 간단한 연습입니다. 이것이 UCSPI-TCP의 전부입니다. 표준 I/O를 사용하는 프로그램을 가져와서 이를 중심으로 간단한 프레임워크를 래핑하여 TCP 서버로 만듭니다. 전송에 대한 걱정 없이 다른 것으로 대체 cat
하고 서비스 계약을 변경할 수 있습니다. 마찬가지로 UCSPI-TCP 도구를 UCSPI-LOCAL 도구로 교체하고 cat
.
여러 UCSPI-TCP 도구 세트가 있습니다. 다니엘 J. 번스타인(Daniel J. Bernstein)이 하나 썼습니다. Laurent Bercot가 하나 썼습니다. Gerrit Pape가 하나 썼습니다. Adam Sampson이 하나 썼습니다. 나는 하나를 썼다. 또한 여러 도구 세트의 도구를 혼합하고 일치시킬 수 있으며 의도적으로 쉽게 결합할 수 있습니다. 내 도구 fdredir
나 Laurent Bercot의 도구를 사용 redirfd
하거나 비대화형 도구를 생성할 수도 있습니다 sh
. (처음 두 개는 본격적인 도구보다 오버헤드가 낮고 sh
nosh 도구 fdredir
도 내장되어 있으므로 체인 연결에 따른 오버헤드를 더욱 피할 수 있습니다. 외부 명령.)
이를 수행하는 방법에는 여러 가지가 있습니다.
- Bernstein
tcpserver
(원본 또는 djbwares, IPv6를 지원하지 않음)tcpserver -R -H -l 0 0.0.0.0 2003 fdredir --write 1 /dev/null cat
tcpserver -R -H -l 0 0.0.0.0 2003 redirfd -w 1 /dev/null cat
tcpserver -R -H -l 0 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
- Hoffman
tcpserver
(IPv4 및 IPv6 지원, 원래 Bernstein 기본 DNS 및 INFO 조회 기능이 있으며 꺼야 함)tcpserver -R -H -l 0 ::0 2003 fdredir --write 1 /dev/null cat
tcpserver -R -H -l 0 ::0 2003 redirfd -w 1 /dev/null cat
tcpserver -R -H -l 0 ::0 2003 sh -c 'exec > /dev/null cat'
- 내
tcpserver
shim(IPv4와 IPv6를 모두 지원하지만 각각에 대해 별도의 인스턴스를 실행해야 하며 더 현대적인 기본값이 있음)tcpserver ::0 2003 fdredir --write 1 /dev/null cat
tcpserver ::0 2003 redirfd -w 1 /dev/null cat
tcpserver ::0 2003 sh -c 'exec > /dev/null cat'
- 내 UCSPI-TCP 도구(Linux와 FreeBSD에서 하나로 IPv4와 IPv6 모두 지원)
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept fdredir --write 1 /dev/null cat
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept redirfd -w 1 /dev/null cat
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept sh -c 'exec > /dev/null cat'
- Bercot
s6-tcpserver6
(s6-tcpserver4
IPv4 대체)s6-tcpserver6 ::0 2003 fdredir --write 1 /dev/null cat
s6-tcpserver6 ::0 2003 redirfd -w 1 /dev/null cat
s6-tcpserver6 ::0 2003 sh -c 'exec > /dev/null cat'
- Bercot s6 - 네트워크 도구(
s6-tcpserver4
IPv4 대체)s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d fdredir --write 1 /dev/null cat
s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d redirfd -w 1 /dev/null cat
s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d sh -c 'exec > /dev/null cat'
- Pappu
tcpsvd
(IPv6를 지원하지 않음)tcpsvd 0.0.0.0 2003 fdredir --write 1 /dev/null cat
tcpsvd 0.0.0.0 2003 redirfd -w 1 /dev/null cat
tcpsvd 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
- Sampson
onenetd
(IPv4와 IPv6를 모두 지원하지만 각각에 대해 별도의 인스턴스를 실행해야 함)onenetd -6 ::0 2003 fdredir --write 1 /dev/null cat
onenetd -6 ::0 2003 redirfd -w 1 /dev/null cat
onenetd -6 ::0 2003 sh -c 'exec > /dev/null cat'
대안을 즐기다
16진수 덤프 -C 1>&2또는 (없음
sh
)fdmove -c 1 2 16진수 덤프 -C테스트 중인 클라이언트 프로그램이 수행하는 작업에 대한 로컬 로그를 얻기 위해 서버 프로그램에 사용됩니다. ☺
추가 읽기
- 규약:
- 조나단 데보인 폴라드(2016).UNIX 클라이언트-서버 프로그래밍 인터페이스의 gen. 자주 주어지는 답변입니다.
- 번스타인, 다니엘(1996).UNIX 클라이언트-서버 프로그램 인터페이스. cr.yp.to.
- 도구 세트:
- 참고 도서:
- 다니엘 J. 번스타인.프로그램
tcpserver
. ucspi-tcp. - 어빈 호프만.
tcpserver
. ucspi-tcp6. fehcom.de. s6-tcpserver4
. 로랑 베르코. s6 네트워크. skarnet.org.s6-tcpserver6
. 로랑 베르코. s6 네트워크. skarnet.org.fdmove
. 로랑 베르코. 구현하다. skarnet.org.redirfd
. 로랑 베르코. 구현하다. skarnet.org.tcpsvd
. ipsvd. Gerrit Papp.smarden.org.- 조나단 데보인 폴라드(2019).
tcpserver
. DJB웨어. 소프트웨어. - 조나단 데보인 폴라드(2019).
fdredir
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2019).
fdmove
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2019).
tcp-socket-listen
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2019).
tcp-socket-accept
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2019).
tcpserver
. 스낵 가이드. 소프트웨어.
- 다니엘 J. 번스타인.프로그램