엄범

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


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

accept 할 때 addr을 별도로 저장할 필요가 없다. ``py class SocketType`` 에 정의되어 있다.
```python
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()

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


timeout을 지정하는 경우

키보드 인터럽트를 걸어도 timeout이 되는 순간 키보드 인터럽트를 처리하게 되므로, timeout exception을 처리하다가 KeyboardInterrupt exception이 또 다시 발생하게 된다. 따라서 다음과 같이 두번 묶어야 한다.

이게 싫으면 ``py settimeout(None)``으로 놓고 blocking 모드로 사용하던가 해야함.


```python

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호출해주는 것 보다는 그냥 ``py with``를 쓰는게 좋다. 알아서 소켓 닫아줌.

'Languages & Frameworks > Python' 카테고리의 다른 글

[python] pdb : 디버깅  (0) 2018.11.12
[python] 성능 측정, 프로파일링(profiling)  (0) 2018.11.12
[python] socket  (0) 2018.11.10
[python] Flask  (0) 2018.11.05
[python] CLI에서 쓸만한 라이브러리들  (0) 2018.10.25
[python] docstring  (0) 2018.10.15