한개의 소켓을 사용할 때는 당연히 작성자가 포트를 지정했으니 포트값이 지정된 변수를 가져오면 쉽게 알 수 있습니다.
다만, 여러 개의 포트를 열었을 경우 반복문 등을 통해 실행하면 어떤 포트로 들어온 것인지 확인해야 하는 경우가 있습니다.
getsockname() 함수를 사용해서 현재 소켓에 bind 된 ip와 포트 정보를 확인할 수 있습니다.
import socket
import select
sockets = []
for port in [555, 777]:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(("0.0.0.0", port))
sockets.append(server_socket)
empty = []
while True:
readable, writable, exceptional = select.select(sockets, empty, empty)
for s in readable:
(client_data, client_address) = s.recvfrom(1024)
print(s.getsockname(), client_address, client_data)
for s in sockets:
s.close()
위 예제를 보시면 udp 로 0.0.0.0:555 와 0.0.0.0:777 을 bind 하고 select 함수로 각 포트 입력을 기다립니다. 입력이 있으면 recvfrom() 으로 값을 읽어들여서 출력하는데 이 때 s.getsockname() 을 호출해서 소켓에 bind 된 ip와 포트를 출력하게 됩니다. 아래는 실제 출력 메시지입니다.
('내 소켓 bind ip', 내 소켓 bind port) ('들어온 패킷 ip', 들어온 패킷 port) 실제 데이터 형태로 되어 있습니다.
('0.0.0.0', 555) ('127.0.0.1', 1004) b'HELLO UDP!!'
('0.0.0.0', 777) ('127.0.0.1', 1005) b'HELLO UDP'
('0.0.0.0', 555) ('127.0.0.1', 1004) b'HELLO UDP!!'
('0.0.0.0', 777) ('127.0.0.1', 1005) b'HELLO UDP'
'IT > python' 카테고리의 다른 글
python 에서 tar.gz 파일 만들기 (0) | 2021.06.15 |
---|---|
[python3] 인스턴스의 클래스 이름 출력하기 (0) | 2021.05.03 |
[python] json.dumps object of type bytes is not json serializable (0) | 2020.12.22 |
[python3] smtp 로 여러명에게 이메일 보내기 (0) | 2020.12.14 |
변수 범위 이해가 안감.. (0) | 2020.11.27 |