IT/컴퓨터프로그램
네트워크 프로그래밍 기초: 유니캐스트, 브로드캐스트, 멀티캐스트의 이해와 실습 예제
chn1002
2024. 5. 6. 09:25
네트워크 프로그래밍에 관심이 있는 분들을 위해, 일상적인 네트워크 상호작용에서 흔히 사용되는 세 가지 데이터 전송 방식인 유니캐스트(Unicast), 브로드캐스트(Broadcast), 멀티캐스트(Multicast)를 Python을 사용해 간단하게 구현하는 방법을 소개하고자 합니다. 이 글은 네트워크 개발자 또는 관심 있는 개발자들이 기본적인 네트워크 통신을 이해하고 실제 코드로 어떻게 구현되는지 배울 수 있는 기회를 제공합니다.
유니캐스트 (Unicast)
유니캐스트는 네트워크에서 한 장치에서 다른 한 장치로 데이터 패킷을 직접 전송하는 방식입니다. 가장 흔한 통신 방식으로, 웹 서핑, 이메일 전송 등 대부분의 인터넷 활동이 유니캐스트를 통해 이루어집니다.
서버 코드:
import socket
def unicast_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("Server is listening on localhost:12345")
while True:
client_socket, addr = server_socket.accept()
print(f"Connected by {addr}")
message = client_socket.recv(1024).decode()
print(f"Received message: {message}")
client_socket.sendall("Message received".encode())
client_socket.close()
if __name__ == "__main__":
unicast_server()
클라이언트 코드:
import socket
def unicast_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
client_socket.sendall("Hello, server!".encode())
response = client_socket.recv(1024).decode()
print(f"Server response: {response}")
client_socket.close()
if __name__ == "__main__":
unicast_client()
브로드캐스트 (Broadcast)
브로드캐스트는 네트워크의 모든 장치에 동시에 데이터를 전송하는 방식으로, 네트워크 초기화나 긴급 알림 전송에 유용합니다.
브로드캐스트 클라이언트 코드:
import socket
def broadcast_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
message = "Hello, broadcast!".encode()
client_socket.sendto(message, ('<broadcast>', 12345))
client_socket.close()
if __name__ == "__main__":
broadcast_client()
멀티캐스트 (Multicast)
멀티캐스트는 데이터를 특정 그룹의 멤버들에게만 전송하는 방식으로, 대규모 실시간 데이터 전송에 효과적입니다. 예를 들어, 라이브 비디오 스트리밍이나 회의 시스템에서 사용됩니다.
멀티캐스트 수신자 코드:
import socket
import struct
def multicast_receiver():
multicast_group = '224.0.0.5'
server_address = ('', 12345)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
print("\nWaiting to receive message")
data, address = sock.recvfrom(1024)
print(f"Received {len(data)} bytes from {address}")
print(data.decode())
if __name__ == "__main__":
multicast_receiver()
멀티캐스트 송신자 코드:
import socket
import time
def multicast_sender():
multicast_group = ('224.0.0.5', 12345)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(0.2)
ttl = struct.pack('b', 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
try:
while True:
message = 'Multicast message!'
print(f"Sending {message}")
sock.sendto(message.encode(), multicast_group)
time.sleep(1)
finally:
sock.close()
if __name__ == "__main__":
multicast_sender()
이러한 코드 예제들은 각 전송 방식의 기본적인 사용법을 보여주며, 실제 네트워크 환경 또는 테스트 환경에서 통신 방식을 이해하고 구현하는 데 도움이 될 것입니다. 각 코드는 로컬 환경에서 실행해볼 수 있으며, 실제 적용하기 전에 환경 설정을 확인하는 것이 중요합니다.