티스토리 뷰

클라이언트 프로그램에서 connect()시스템콜이 실패했을때 다시 소켓을 만든다음에 connect를 해야한다고 권장한다.


그 이유는 connect() 시스템콜이 실행 되었을때 클라이언트가 서버측으로 tcp 3 way handshaking을 시작하기 위해 SYN메시지를 보내게 되는데 어떤 이유에서든 connect()가 완료 되지 못했다면 


그 클라이언트의 connect() 실패한 그 소켓은 불안정한 상태가 되었기 때문에 없애고(close()하고) 다시 만들어서 연결설정을 다시 해야한다. 


그렇지 않고 내가 connect() 실패한 소켓으로 read/write를 하려고 하면 연결설정이 안된 상태기 때문에 아무리 read/write를 호출해도 서버와 연결이 안되어있기 때문에 데이터 송수신이 불가능하다.


또한 다시 그 실패한 소켓으로 connect()시도를 한다고 하더라도 이미 그 소켓은 불안정한 상태이므로 다시 사용하면 안된다.


스택 오버플로우 답변


 the specifications suggest that the "file" no longer refers to anything. To me this indicates that the handle is still valid however it needs to be re-initialized. – Hassan Syed Feb 10 '10 at 15:05


->파일 디스크립터(소켓번호)가 아무것도 지칭하지 않는다는듯? 즉 커넥트에 실패하면 소켓번호가 날라간다?


Sockets corresponding to broken connection is in unstable state. normally you will not be allowed to connect to again unless the operating system release the socket.


-> 소켓이 불안정한 상태가 된다, 일반적으로 os가 소켓을 놔주기 전까진 실패한 소켓으로 다시 연결 시도를 할 수 없다.


A socket which has failed to connect may not be in EXACTLY the same state as a brand new one - which could cause problems later

-> 연결에 실패한 소켓은 새것과 정확히 동일한 상태가 아니며, 나중에 문제를 일으킬 수 있다.



댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함