본문 바로가기

개발자 레니는 지금 -/공부하는 중

TCP/IP 소켓 연결 데이터 flush

개발자 될 때 까지..

Sending a reset in TCP/IP Socket connection

#Command #사용자변수

#소켓재사용 #socket #reuseaddr


소켓이 비정상적으로 끊어지더라도 data 손실을 방지하기 위해서 버퍼에 있는 소켓은 바로 버려지지 않는다고 한다.

그래서 소켓을 금방 재시작시키면 남아 있는 data가 전송되어 통신에 문제를 주기도 한다.


socket 라이브러리에는 이를 해결할 수 있도록 비정상 종료시 버퍼에 있는 data를 어떻게 할 것인가에 대한 옵션을 가지고 있다.

socket.SO_LINGER " 이라는 옵션인데 사용방법이 Linux와 Window에서 조금 다르다.

포멧 형식이 달라서 그런거라고 한다. Window는 Struct linger에서 shour를 사용하지만, Linux는 int를 사용하기 때문이라고...


C

socket_name.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger))

위와 같은 방법으로 사용한다고 보면 되며 window일경우, ii 부분을 hh로 수정해야한다. 

동작이 정말로 되는 것인지는 아직 정확하게 확인을 못해보았다.


Python

socket_name.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)