3

可能であればUDPを使用してブロードキャストメッセージを送受信するためのコードまたはリンクを誰かに教えてもらえますか?

私は問題に悩まされており、u人が私がそれを解決するのを手伝ってくれることを願っています。ありがとう

4

4 に答える 4

2

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 + ".");   
   }
}
于 2009-04-10T15:12:08.770 に答える
2

ブロードキャストの送信者と受信者の両方のコード例を次に示します。

標準の 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";
}
于 2009-05-10T07:09:32.990 に答える
1

私はこれを学び始めたばかりですが、これは私の最初の実例でした。

受信者コード:

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;
            }
        }
    }
}
于 2010-04-02T14:20:57.090 に答える
1

コードを投稿するつもりはありません。いくつかの観察事項があります。

  1. UDP ブロードキャストの送信は、ユニキャスト パケットの送信と同じです。宛先アドレスのみが異なります。これ(255.255.255.255) の場合INADDR_BROADCASTもありますが、複数のネットワーク インターフェイスを持つシステムでは問題が発生する可能性があります。送信するインターフェイスの特定のブロードキャスト アドレスに送信することをお勧めします。SO_BROADCAST唯一の重要な警告は、OS がブロードキャストの送信を許可する前に、ソケット オプションを設定する必要がある場合があることです。

  2. UDP ブロードキャストの受信は、ユニキャスト パケットの受信とまったく同じです。特別なコードは必要ありませんが、レシーバーを にバインドする必要がありますINADDR_ANY

于 2009-04-12T12:21:09.693 に答える