マルチキャストの検証
マルチキャスト通信が可能か確認したい
スイッチ周りはおいておいて、とりあえず同じセグメント内で確認したい。
Geminiでスクリプトを作成させた。動くことは確認ができた 送信側スクリプト
Windwos版(PowerShellを管理者権限で起動)
code:powershell
$mcastAddr = "239.1.1.1"
$port = 9999
$client = New-Object System.Net.Sockets.UdpClient
# TTLを2に設定(同一セグメントのルーター越えを考慮)
$message = "Hello from Windows Multicast!"
$client.Send($data, $data.Length, $endpoint)
Write-Host "Windowsからメッセージを送信しました: $message" -ForegroundColor Cyan
$client.Close()
Mac版(Terminalで実行)
code:bash
python3 -c 'import socket; \
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP); \
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2); \
sock.sendto(b"Hello from Mac Multicast!", ("239.1.1.1", 9999))'
受信側スクリプト
Windwos版(PowerShellを管理者権限で起動)
code:poweshell
$port = 9999
$mcastAddr = "239.1.1.1"
# 以前の接続が残っている場合に備えて一度クリアを試みる
if ($client) { $client.Close() }
$client = New-Object System.Net.Sockets.UdpClient($port)
Write-Host "Windows: $mcastAddr : $port で受信待機中... (中止は Ctrl+C)" -ForegroundColor Cyan
try {
while($true) {
$data = $client.Receive(ref$endpoint) Write-Host "受信成功 ($($endpoint.Address)): $message" -ForegroundColor Green
}
} catch {
Write-Host "エラーが発生しました: $_" -ForegroundColor Red
} finally {
$client.Close()
Write-Host "クライアントを閉じました。"
}
Mac側
code:bash
python3 -c '
import socket
import struct
MCAST_GRP = "239.1.1.1"
MCAST_PORT = 9999
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("", MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
print(f"Mac: {MCAST_GRP}:{MCAST_PORT} で受信待機中...")
while True:
data, addr = sock.recvfrom(1024)
# decodeの部分をシングルクォーテーションに変更してエラーを回避
print(f"受信成功 ({addr0}): {data.decode("utf-8")}") '