나는 일반적으로 netcat에서 제기되는 "대기->중지" 디자인의 단점을 알고 있습니다.
server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat
(이것은 신뢰할 수 없습니다. 얼마나 기다렸는지 측정할 수 없으며, 1초 동안 네트워크 병목 현상이 더 발생할 가능성이 항상 있습니다. - 또 다른 점 -> 데이터가 전송되었음을 즉시 알 수 있고 처리를 시작할 수 있다면 왜 10초만 기다려야 하는가!)
나는 해결책을 원한다.안정적이고 우수한 TCP 스트림 닫기.
나는 socat을 찾았고 그 종료는 아래에 설명되어 있습니다 man socat
.
종료 단계는 스트림 중 하나가 실제로 EOF에 도달하면 시작됩니다. Socat은 EOF 조건을 다른 스트림에 전달합니다. 즉, 쓰기 스트림만 닫으려고 시도하여 정상적으로 종료할 수 있는 기회를 제공합니다.
다음 명령이 작동하는 것으로 나타났습니다.
서버가 파일을 보냅니다:
server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat
서버가 파일을 수신합니다:
server$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:out.txt,creat && cat out.txt
client$ socat -u FILE:test.txt TCP:127.0.0.1:9876
신뢰할 수 있나요? 개선될 수 있나요? (올바른 옵션을 사용하고 있습니까? 더 나은 설정 옵션이 있습니까? - socat에는 많은 옵션이 있습니다)
답변1
내 생각에는 귀하의 코어가 신뢰할 수 있는 것 같습니다. 이는 신뢰할 수 있어야 하며 파일이 완전히 전송된 후에 종료되어야 합니다.
그러나 out.txt
이 설정이 이미 존재하는 경우 예기치 않게 동작할 수 있습니다. out.txt
보다 긴 경우 socat는 파일이 비어 있는지 확인하는 대신 파일을 바이트 단위로 덮어쓰기 때문에 test.txt
마지막 부분이 유지됩니다 . out.txt
수행하려는 작업에 따라 이 문제를 해결하는 방법에는 여러 가지가 있습니다.
OPEN:out.txt,creat,trunc
out.txt
쓰기 전에 모든 바이트가 삭제됩니다. 이 옵션은 귀하의 기대와 유사cp
하며 귀하가 원하는 것일 수도 있습니다.OPEN:out.txt,creat,excl
out.txt
이미 존재하는 경우 쓰기가 거부됩니다. 보안을 강화하려면 이 옵션을 사용하십시오.OPEN:out.txt,creat,append
에 데이터를 추가합니다out.txt
.
md5sum
이러한 극단적인 경우 때문에 저는 이와 같은 것을 함께 연결할 때마다 소스 및 대상 파일에서 실행하는 것을 좋아합니다.