새소식

Programming/python

[python] 소켓이 사용중인 포트 확인하기

  • -

한개의 소켓을 사용할 때는 당연히 작성자가 포트를 지정했으니 포트값이 지정된 변수를 가져오면 쉽게 알 수 있습니다.

다만, 여러 개의 포트를 열었을 경우 반복문 등을 통해 실행하면 어떤 포트로 들어온 것인지 확인해야 하는 경우가 있습니다.

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'
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.