首页
学习
活动
专区
圈层
工具
发布

广播
EN

Stack Overflow用户
提问于 2009-04-10 14:58:31
回答 4查看 2.1K关注 0票数 3

如果可能的话,谁能向我提供发送和接收广播消息的代码或链接?

我陷入了一个问题,希望你们能帮我解决这个问题。谢谢

EN

回答 4

Stack Overflow用户

发布于 2009-04-10 15:12:09

下面是一个C#示例:

代码语言:javascript
复制
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 + ".");   
   }
}
票数 2
EN

Stack Overflow用户

发布于 2009-05-10 07:09:33

以下是广播发送器和接收器的示例代码。

它应该可以很容易地移植到任何可以访问标准Berkly Sockets API的语言。

代码语言:javascript
复制
#!/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";
}
票数 2
EN

Stack Overflow用户

发布于 2009-04-12 12:21:10

我不打算发布代码,只有几点观察:

  1. 发送UDP广播就像发送单播数据包-只是目的地址不同。这可以是INADDR_BROADCAST (255.255.255.255),但这可能会在具有多个网络接口的系统上导致问题。最好是发送到您想要发送的接口的特定广播地址。唯一重要的警告是,在操作系统允许向broadcast.
  2. Receiving发送SO_BROADCAST广播与接收单播数据包之前,您可能需要设置UDP套接字选项。不需要特殊的代码,但应该将接收器绑定到INADDR_ANY.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/737899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档