TCP를 통한 안정적인 파일 전송을 위한 socat

TCP를 통한 안정적인 파일 전송을 위한 socat

나는 일반적으로 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,truncout.txt쓰기 전에 모든 바이트가 삭제됩니다. 이 옵션은 귀하의 기대와 유사 cp하며 귀하가 원하는 것일 수도 있습니다.
  • OPEN:out.txt,creat,exclout.txt이미 존재하는 경우 쓰기가 거부됩니다. 보안을 강화하려면 이 옵션을 사용하십시오.
  • OPEN:out.txt,creat,append에 데이터를 추가합니다 out.txt.

md5sum이러한 극단적인 경우 때문에 저는 이와 같은 것을 함께 연결할 때마다 소스 및 대상 파일에서 실행하는 것을 좋아합니다.

관련 정보