2011-07-06 4 views
2

서버 소켓이 정상적으로 종료되었는지 파이썬에서 종료되었는지 확인하려고합니다.파이썬에서 소켓의 정상적인 종료 감지하기

프로그램에서 파일을 받았고 전송 중에 오류가 발생하면 파일을 제거해야합니다.

나는 파일 전송이 완료되었음을 서버에 알리기 위해 클라이언트가 파일 길이 또는 일부 종료 데이터를 전송하게하는 것이 가장 좋습니다.
슬프게도, 나는 클라이언트를 변경할 수 없다. 단지 원시 TCP를 통해 파일을 덤프하고 그것에 대해 할 수있는 일이 없다. 그래서 제발, 아니 "하지만 당신이 그것을 바꿀 수있다"또는 "귀하의 프로토콜에 결함이있다", 나는 프로토콜을 작성하지 않았으므로 그것을 처리해야합니다.

스크립트가 OSX와 Linux에서 모두 작동해야 epoll이 종료됩니다.

제안 사항?

나는 어떤 오류가 발생했는지 상관하지 않는다고 덧붙일 수 있습니다.

+0

네트워크 수준 예외를 포착하지 않습니까? – Rahul

+1

소켓 끝을보고하여 정상적으로 닫습니다. 너는 무엇을 더 알 필요가 있니? –

+0

네,하지만 어떻게 읽습니까? –

답변

0

내가해야 할 일은 소켓 시간 제한을 1 분처럼 낮추고, recv 호출을 던지고 1 분 후에 예외를 발생시키는 것입니다.

1

다른 끝에서 데이터 전송이 끝나면 소켓을 쓰기 위해 셧다운해야합니다 (2). 그런 다음 멀티플렉싱 루프에서 소켓이 쓰기 위해 셧다운되었거나 원격 종료로 닫힌 것 (& 쓰기)을 확인할 수 있습니다. 이는 정상적인 종료이며 select/poll/kqueue 등을 사용할 수 있습니다.

클라이언트가 그렇게하지 않으면 종료 문자를 보내지 않으며 길이 또는 체크섬을 전송하지 않습니다.

프로토콜에 대한 자세한 내용을 삭제해야합니다. 클라이언트가 파일 보내기 전용으로 TCP 소켓을 열어 줍니까? 전송이 완료되면 소켓을 닫습니까?

최악의 시나리오에서는 파일의 무결성을 확인해야합니다. 형식을 알고있는 경우 런타임 중에 확인하거나 cron 탭에서 정리를 시도 할 수 있습니다. 그렇게 할 수 없다면 해결책을 찾는 것이 어려울 것입니다. 행운을 빌어 요 ...

+0

예, 소켓이 열리고 파일이 전송 된 다음 소켓이 정상적으로 닫힙니다. 자바에서는 출력 스트림을 닫고 -1을 반환 할 read()를 기다린다. –

+0

그리고 네트워크 오류가 발생하면 어떻게 될까? 소켓이 너무 닫혀 있다고 생각합니다. 정상적으로 닫혔는지 여부를 말할 방법이 없습니다. 그러므로 소켓에 WRITING을위한 shutdown() 호출을 먼저 사용하여 쓰기가 끝났음을 상대방에게 알리는 것이 좋습니다. Java의 정상 종료에 대한 자세한 내용은 http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#shutdownOutput%28%29를 참조하십시오. – Aki