이번에는 DatagramSocket과 DatagramPacket으로 브로드캐스트를 구현해보려고 한다.
출처 : https://ko.wikipedia.org/wiki/브로드캐스팅_(네트워킹)
브로드 캐스트는 같은 네트워크 내 모든 노드에게 패킷이나 프레임을 보낼때 쓰는 방식이다.
일대다 연결이라 TCP에선 쓸 수 없다.
UDP로는 사용 할 수 있지만 주로 노드들의 정보교환 정도로만 쓰인다.
좀 더 디테일 하게 들어가면,
데이터 링크 계층 브로드캐스트 (MAC 브로드 캐스트)
네트워크 계층 브로드캐스트 (IP 브로드 캐스트)로 나뉘는데,
MAC 브로드 캐스트는 목적지를 FF:FF:FF:FF:FF:FF로 정하고 보내는 프레임이고
IP 브로드 캐스트는 목적지를 255.255.255.255로 정하고 보내는 패킷이다.
이 둘의 차이점은 어떤 계층에서 브로드 캐스팅이 이루어지는지 차이인데, 사실상 그냥 브로드 캐스팅을 할때는 둘다 쓰인다고 보면 된다.
(MAC 브로드 캐스트는 ARP에서 쓰이고)
(IP 브로드 캐스트는 DHCP에서 쓰인다.)
이번엔 아쉽게도 가상머신을 사용할 수 없다. 브로드캐스트는 보안 이슈 때문에 기본적으로 라우터에서 막히고 OS단에서도 막는다.
그래서 같은 PC 환경에서 실행했다.
서버가 255.255.255.255(브로드캐스트 ip)로 DatagramPacket을 보내면 클라이언트가 받아서
화면에 보여주는 예제를 준비했다.
public class ServerSocket {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "My ip is : " + InetAddress.getLocalHost().getHostAddress();
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("255.255.255.255"), 6000);
socket.send(packet);
socket.close();
}
}
이번에는 클라이언트와 연결을 하지 않는다. 패킷을 보내기만 한다.
DatagramSocket
은 DatagramPacket
을 보내기 위한 소켓으로 DatagramPacket
은 네트워크 계층에서 tcp/ip(가상회선방식)이 아닌 데이터그램 방식의 패킷을 보낼때 쓰는 클래스다.
(데이터그램 - http://www.ktword.co.kr/test/view/view.php?m_temp1=634)
InetAddress.getLocalHost().getHostAddress()
은 내 로컬 주소를 반환한다.
str
은 "My ip is : [내 아이피]"가 될 것이다.
패킷은 포트를 6000
, 주소를 255.255.255.255
로 보낸다고 설정했다.
socket.send(packet)
을 통해 만들어진 패킷을 보낸다.
public class ClientSocket {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(6000);
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String str = new String(buf, 0, packet.getLength());
System.out.println("input : " + str);
socket.close();
}
}
클라이언트 코드는 패킷에 주소를 할당하지 않았다. (비연결성)
socket.receive(packet)
으로 서버의 패킷을 기다릴 것이다.
서버에서 브로드캐스트 패킷을 보냈으니 분명 여기서 받을 수 있을 것이다.
input : My ip is : 198.0.10.1
클라이언트는 성공적으로 서버의 패킷을 받아냈다.
출력으로는 서버의 IP가 보인다.