可能であればUDPを使用してブロードキャストメッセージを送受信するためのコードまたはリンクを誰かに教えてもらえますか?
私は問題に悩まされており、u人が私がそれを解決するのを手伝ってくれることを願っています。ありがとう
可能であればUDPを使用してブロードキャストメッセージを送受信するためのコードまたはリンクを誰かに教えてもらえますか?
私は問題に悩まされており、u人が私がそれを解決するのを手伝ってくれることを願っています。ありがとう
C# の例を次に示します。
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class MainClass {
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(StartUDPListener);
UdpClient udpClient = new UdpClient();
udpClient.Send(new byte[]{0x00}, 1, new IPEndPoint(IPAddress.Broadcast, 4567));
Console.ReadLine();
}
private static void StartUDPListener(object state) {
UdpClient udpServer = new UdpClient(new IPEndPoint(IPAddress.Broadcast, 4567));
IPEndPoint remoteEndPoint = null;
udpServer.Receive(ref remoteEndPoint);
Console.WriteLine("UDP broadcast received from " + remoteEndPoint + ".");
}
}
ブロードキャストの送信者と受信者の両方のコード例を次に示します。
標準の Berkly Sockets API にアクセスできる任意の言語に簡単に移植できる必要があります。
#!/usr/bin/perl -w
# broadcast sender script
use strict;
use diagnostics;
use Socket;
my $sock;
my $receiverPort = 9722;
my $senderPort = 9721;
socket($sock, PF_INET, SOCK_DGRAM, getprotobyname('udp')) || die "socket: $!";
setsockopt($sock, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt: $!";
setsockopt($sock, SOL_SOCKET, SO_BROADCAST, pack("l", 1)) or die "sockopt: $!";
bind($sock, sockaddr_in($senderPort, inet_aton('192.168.2.103'))) || die "bind: $!";
while (1) {
my $datastring = `date`;
my $bytes = send($sock, $datastring, 0,
sockaddr_in($receiverPort, inet_aton('192.168.2.255')));
if (!defined($bytes)) {
print("$!\n");
} else {
print("sent $bytes bytes\n");
}
sleep(2);
}
#!/usr/bin/perl -w
# broadcast receiver script
use strict;
use diagnostics;
use Socket;
my $sock;
socket($sock, PF_INET, SOCK_DGRAM, getprotobyname('udp')) || die "socket: $!";
setsockopt($sock, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt: $!";
bind($sock, sockaddr_in(9722, inet_aton('192.168.2.255'))) || die "bind: $!";
# just loop forever listening for packets
while (1) {
my $datastring = '';
my $hispaddr = recv($sock, $datastring, 64, 0); # blocking recv
if (!defined($hispaddr)) {
print("recv failed: $!\n");
next;
}
print "$datastring";
}
私はこれを学び始めたばかりですが、これは私の最初の実例でした。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class UDPReceiver
{
static void Main(string[] args)
{
IPEndPoint endPoint;
using (UdpClient client = new UdpClient(9998))
{
bool connected = true;
while (connected)
{
byte[] dataBytes = client.Receive(ref endPoint);
string dataString = Encoding.UTF8.GetString(dataBytes);
if (dataString.ToLower() != "exit")
Console.WriteLine(dataString);
else
connected = false;
}
}
}
}
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class UDPSender
{
static void Main(string[] args)
{
using (UdpClient client = new UdpClient())
{
bool connected = true;
while (connected)
{
string dataString = Console.ReadLine();
byte[] dataBytes = Encoding.UTF8.GetBytes(dataString);
client.Send(dataBytes, dataBytes.Length, new IPEndPoint(IPAddress.Broadcast, 9998));
if (dataString.ToLower() == "exit")
connected = false;
}
}
}
}
コードを投稿するつもりはありません。いくつかの観察事項があります。
UDP ブロードキャストの送信は、ユニキャスト パケットの送信と同じです。宛先アドレスのみが異なります。これは(255.255.255.255) の場合INADDR_BROADCAST
もありますが、複数のネットワーク インターフェイスを持つシステムでは問題が発生する可能性があります。送信するインターフェイスの特定のブロードキャスト アドレスに送信することをお勧めします。SO_BROADCAST
唯一の重要な警告は、OS がブロードキャストの送信を許可する前に、ソケット オプションを設定する必要がある場合があることです。
UDP ブロードキャストの受信は、ユニキャスト パケットの受信とまったく同じです。特別なコードは必要ありませんが、レシーバーを にバインドする必要がありますINADDR_ANY
。