socket에서 read()할때 0을 돌려주는 경우와 ECONNRESET의 차이점이 궁금합니다.
글쓴이: superkkt / 작성시간: 목, 2006/03/16 - 11:10오후
메뉴얼을 보니 peer가 orderly shutdown을 하면 0을 돌려주고, forcibly closed를 하면 -1과 함께 ECONNRESET이 셋팅된다고 되어 있습니다.
그럼 상대방이 close() 함수를 사용하면 무조건 ECONNRESET이 나오고 shutdown()함수를 사용해야만 0을 돌려주는건가요? 제가 알기론 두 함수 모두 FIN segment를 peer에게 보내는걸로 알고 있는데요.. 그외에 다른 차이점이 있나요?
Forums:
FIN을 받으면 연결이
FIN을 받으면 연결이 끊겼다는 걸 알 수 있고, 우아하게 0을 돌려줄 수 있습니다. 그런데... 상대쪽 프로그램이 여차저차한 이유로 소켓을 닫았는데 마침 그때 한동안 네트워크 장애가 있어서 이쪽에서 끝끝내 FIN 패킷을 받지 못했다면 어떻게 될까요? 시간이 흘러 상대쪽 장비에서는 그 소켓에 대한 상태 정보가 완전히 사라져 버렸습니다. 그 때 이쪽에서 send()를 하거나, recv() 중이라도 keepalive 보낼 시간이 돼서 그 쪽으로 어떤 패킷을 보내면 그에 대한 답장으로 RST 패킷을 받게 되고, 그러면 -1(ECONNRESET)을 돌려받게 됩니다.
----
$PWD `date`
$PWD `date`
음.. 그런데 제가
음.. 그런데 제가 테스트해본 바로는 클라이언트에서 종료를 하면 바로 서버에서 ECONNRESET을 돌려주던데요.. 이게 FIN을 못받아서 나오는건 아닌것 같은데요..
======================
BLOG : http://superkkt.com
클라이언트가
클라이언트가 close()하지 않고 exit()하면 클라이언트가 OS가 서버에게 RST를 보내는 것으로 알고 있습니다.
ethereal로 패킷을
ethereal로 패킷을 잡아봤는데요.. 서버(유닉스)쪽에서 close로 소켓을 끊을때는 FIN이 클라이언트로 전송됩니다. 그런데 클라이언트(윈도우)에서 연결종료(프로그램 종료 아님)를 하면 RST가 서버로 전송되네요.. 아! FTP 프로그램을 테스트하고 있습니다. 클라이언트는 알FTP, FileZila 사용했습니다.
클라이언트 프로그램 종료가 아니라 단순히 연결끊기만 했을뿐인데 RST가 날라가는군요.. 윈도우라 그런가..
======================
BLOG : http://superkkt.com
댓글 달기