Post

(python) socket

2017/08/25 - [Coding Syntax/etc] - Socket programming Tips

socket 객체에서 로컬 (주소, 포트) 리모트 (주소, 포트) 가져오기

accept 할 때 addr을 별도로 저장할 필요가 없다. class SocketType 에 정의되어 있다.

1
2
3
4
sock.getsockname() -- return local address
('192.168.0.2', 31234)
sock.getpeername() -- return remote address [\*]
('192.168.110.131', 6627)

그냥 socket.connect() 보다 socket.create_connection()

https://docs.python.org/3/library/socket.html#socket.create_connection

단, create_connection() 호출하면서 자동으로 socket.socket()객체 만들고 connect()불러서 결과를 반환해주기 때문에 내가 상속한 socket 객체를 생성하고 싶다면 그냥 직접 만들고 connect() 해야 한다.

timeout을 지정하는 경우

키보드 인터럽트를 걸어도 timeout이 되는 순간 키보드 인터럽트를 처리하게 되므로, timeout exception을 처리하다가 KeyboardInterrupt exception이 또 다시 발생하게 된다. 따라서 다음과 같이 두번 묶어야 한다. 이게 싫으면 settimeout(None)으로 놓고 blocking 모드로 사용하던가 해야함.

1
2
3
4
5
6
7
8
9
10
11
sock.settimeout(1)
try:
try:
cmd\_raw = sock.recv(1024)
cmd = cmd\_raw.decode()
print("cmd : " + cmd)
except socket.timeout:
continue
except (KeyboardInterrupt, EOFError) as e:
print("[\*] KeyboardInterrupt")
break

예외 상황 이것 저것 신경써서 close호출해주는 것 보다는 그냥 with를 쓰는게 좋다. 알아서 소켓 닫아줌.

This post is licensed under CC BY 4.0 by the author.