WHEREIS

python 3.5.2 및 Rocky8.9 에서 테스트

https://access.redhat.com/solutions/5581841

위 페이지를 보면 커널 4.5 부터 지원한다고 되어있고
이하 버전에서는 지원하지 않음 (CentOS7)

SOCK_DESTROY answers: Invalid argument

서버용 스크립트

#!/usr/bin/env python3
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 12345))
server_socket.listen(5)

print("서버가 12345 포트에서 대기 중입니다...")

client_socket, addr = server_socket.accept()
print("클라이언트가 연결됨: {}".format(addr))

try:
while True:
pass
except KeyboardInterrupt:
print("서버가 종료됩니다.")
finally:
client_socket.close()
server_socket.close()

클라이언트용 스크립트

#!/usr/bin/env python3
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))

print("서버에 연결됨. 클라이언트를 강제로 종료합니다...")

client_socket.close()

결과

위 코드를 1개 서버에서 실행해 줌 (클라이언트이자 서버)
다음과 같이 확인 후 kill 처리하면 해당 소켓이 사라진 것을 확인

root@test:/proc/8335/fd># netstat -natlp | grep CLOSE
tcp 1 0 127.0.0.1:12345 127.0.0.1:35808 CLOSE_WAIT -
tcp 1 0 127.0.0.1:12345 127.0.0.1:29132 CLOSE_WAIT 8335/python3
tcp 1 0 127.0.0.1:12345 127.0.0.1:60668 CLOSE_WAIT -

root@test:/proc/8335/fd># ss --tcp state CLOSE-WAIT dport = 60668 --kill
Recv-Q Send-Q Local Address:Port Peer Address:Port Process
1 0 127.0.0.1:italk 127.0.0.1:60668
root@test:/proc/8335/fd>#
root@test:/proc/8335/fd># netstat -natlp | grep CLOSE
tcp 1 0 127.0.0.1:12345 127.0.0.1:35808 CLOSE_WAIT -
tcp 1 0 127.0.0.1:12345 127.0.0.1:29132 CLOSE_WAIT 8335/python3

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band
loading