작은 파일(~100KB)을 보내기 위해 TCP를 사용하는 간단한 socat 파일 서버를 설정하려고 합니다.
다음은 하나의 파일에 대한 한 줄 서버와 클라이언트입니다.
섬기는 사람:socat -u -d -d OPEN:file.dat TCP-LISTEN:<port>,reuseaddr,fork
고객:socat -u -d -d TCP:<server>:<port> OPEN:file.dat,creat
첫 번째 데이터 전송은 항상 작동하지만 다음은 항상 작동하는 것은 아닙니다. 다음 전송의 대부분은 클라이언트 측에 빈 파일을 생성합니다. 여러 클라이언트가 한 번 전송하면 문제가 지속되며 버그가 발생할 때 데이터가 전송되지 않지만 로그 및 반환 값에는 오류가 표시되지 않고 데이터 루프가 짧아지는 것을 확인했습니다.
나는 여기에 언급된 거의 모든 옵션을 시도했습니다.http://www.dest-unreach.org/socat/doc/socat.html
여러 번 연속해서 작동하게 만드는 유일한 방법은 서버 리스너에서 포크 옵션을 제거하고 전체 명령 줄을 bash 루프로 래핑하는 것이지만 물론 여러 클라이언트에서는 실패합니다.
나는 Ubuntu, Fedora, Redhat 및 FreeBSD를 사용해 보았습니다.
뭔가 빠졌나요? 아니면 버그인가요?
답변1
나도 같은 문제가 있었고 내가 뭘 잘못하고 있는지 알아내는 데 몇 시간이 걸렸습니다. 아직은 그렇지 않지만 적어도 작동하게 만드는 방법은 알고 있습니다. 나는 다음을 사용하고 있었습니다:
socat -u FILE:/tmp/test.txt TCP-LISTEN:5778,reuseaddr,fork
그리고 다음으로 전환했을 때 예상대로 작동했습니다.
socat TCP-LISTEN:5778,reuseaddr,fork FILE:/tmp/test.txt
실제로 무엇이 변경되는지는 잘 모르겠지만 -u
플래그를 삭제하고 주소 순서를 바꾸면 여러 클라이언트 호출을 위한 소켓이 열립니다. 복제하려고 하다가 우연히 발견했습니다.서버의 알려진 작동 예.
또한 내 고객은 단순히 socat -u TCP:localhost:5778 STDOUT
. 없이도 작동합니다 -u
.
답변2
남자 남자
$ man socat | grep -m1 '\-u' -A3
-u Uses unidirectional mode. The first address is only used for
reading, and the second address is only used for writing (exam-
ple).
그냥 도와줘도
$ socat -h | grep -m1 '\-u '
...
답변3
이는 서버에 단일 파일 소스와 여러 파일 싱크(TCP 연결, 분기)가 있기 때문입니다. 첫 번째 클라이언트는 파일 위치를 EOF(파일 끝)에 남겨두고 모든 파일을 소비합니다. 후속 TCP 클라이언트는 모두 동일한 파일 소스를 사용하므로 읽을 내용이 없습니다.
이것은 버그라기보다는 socat의 디자인 측면에 가깝습니다. 새 연결이 소스 파일의 탐색 위치를 재설정하는 방법을 모르겠습니다.