[TCP/IP] 클라이언트 connect 에러시 종료 안하고 재접속하면 안되나요?
안녕하세요!
학교에서 작업을 하면서 회사 FTP 서버에 접속해서 주기적으로 파일을 받아오는 프로그램을 작성을 했습니다.!
단순 소켓 프로그래밍으로는 접속을 성공해서 RFC에서 알아낸 FTP 명령어를 서버 쪽으로 보내주게 됩니다.
FTP는 Passive모드로 파일을 다운받아오기 때문에 해당 경로나 파일 정보를 받아오기 위해서는 받아올 때마다 PASV 명령어를 보내줘서 데이터용 ip, port번호를 받아옵니다.
근데 제가 원하는 최종 경로는 년도, 월, 일이 포함되어있어서 계속 바뀌기 때문에 최종 경로를 알아내기 위해 주기적으로 PASV LIST 명령어를 보내주어서 ROOT 경로부터 가장 최근 년월일 인 폴더로 경로 설정을 해줘야 합니다.
중간 경로도 LIST 명령어로 받아오는데 이 중간 경로 정보도 데이터이기 때문에 LIST 명령어를 보낼 때마다 connect 함수를 사용하게 됩니다.
서버 쪽에 생성된 최근 경로를 예측해서 최종 파일을 받아오게 되면 하나의 주기가 끝이납니다.
문제는 이걸 주기적으로 FTP 서버에 접속을 하는 프로그램이라 가끔 가다가 이 LIST 명령어를 보내기 위해 connect 함수를 사용했을 때 connect 에러가 뜨고 프로그램이 죽어버립니다...
이게 프로그램이 자주 죽으면 안되는 거라, connect 에러가 뜨면 프로그램 종료 처리를 하지 않고 소켓 종료 후 바로 재접속을 시도하게 되면 문제가 생기는 건가요..?
그렇게 해보았는데 프로그램이 종료는 안하지만 멈춰버려서요..ㅠㅠ
고수님들 도와주십쇼...!
바로 재접속을 하지 마시고 한 5 ~ 10초 딜레이를
바로 재접속을 하지 마시고 한 5 ~ 10초 딜레이를 준 다음 재접속 해 보세요. 때로 OS에서 다 사용한 소켓을 바로 회수하지 않아서 그럴수도 있습니다.
소켓 종료 후 소켓 생성은 하셨겠죠?
네! 소켓 종료 후 소켓 생성으로 다시 시작을 합니다
네! 소켓 종료 후 소켓 생성으로 다시 시작을 합니다!! 5~10초만 딜레이를 주면 안정성을 보장(?)까지는 아니더라도 프로그램이 죽는 경우는 많이 주는 거겠죠? 감사합니다!!!!ㅠㅠㅠㅠ
반대편 서버의 상태도 봐야 합니다. CLOSE_WAIT 상태..
서버와의 네트웍 상태 변이를 잘 봐야겠지요. 한번 디버깅을 해 보세요. gracefuly shutdown이 잘 되어서 CLOSE_WAIT 상태로 남지는 않았는지를요. 확실한 이유를 알기 위해 디버깅을 하는 겁니다. 그냥 몇초 딜레이 줘서 해결하지 마시고요..
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
디버깅을 해주어도 종종 브레이크 되지 않고 프로그램이
디버깅을 해주어도 종종 브레이크 되지 않고 프로그램이 그대로 멈춰버리는 경우가 있더라구요,, 이제까지 계속 디버깅을 해주면서 시도했었는데 디버깅 중 어디에서 프로그램이 멈췄는지 알 수 없는 경우도 있었습니다. 그 문제를 해결하기 위해 다시 여러가지 방법을 검색중입니다..
댓글 달기