【发布时间】:2012-02-23 22:37:11
【问题描述】:
我正在用 C# 编写一个广播信标,它应该向所有监听设备广播服务器信息。发送的信息将包含诸如 WCF 服务的 URL、命名空间、所需参数列表等信息。我现在拥有的是一个发送者和接收者,当它们在同一台计算机上时,它们可以完美地交谈。但是,一旦我将发送者放在接收者之外的另一台计算机上,发送者会发送它的消息,但我的接收者永远不会收到它。没有抛出异常,并且两台机器上的防火墙都被禁用。
http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/ 是我获取代码的地方。
发件人:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDPTest
{
class Program
{
static void Main(string[] args)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050);
byte[] data = Encoding.ASCII.GetBytes("This is a test message");
sock.SendTo(data, iep);
sock.Close();
}
}
}
接收者:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDPBroadcastReciever
{
class Program
{
static void Main(string[] args)
{
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
sock.Bind(iep);
EndPoint ep = (EndPoint)iep;
Console.WriteLine("Ready to recieve");
byte[] data = new byte[1024];
int recv = sock.ReceiveFrom(data, ref ep);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("Received: {0} from: {1}", stringData, ep.ToString());
sock.Close();
Console.ReadLine();
}
}
}
有没有人知道我缺少什么可以让这两个人在两台不同的计算机上交谈的东西?它们在同一个子网 (192.168.1.x)
谢谢 尼克·朗
【问题讨论】:
-
相信不是每个路由器都会转发广播包。也许您可以使用其他已知可以工作的应用程序来检查这一点。
-
您对示例程序有什么建议吗?
-
同时检查 C:\Windows\System32\LogFiles\Firewall 并查看网络设置的配置文件是否阻止了您正在广播的端口
-
@nick 可能是因为您在代码中广播到 255.255.255.255 (
IPAddress.Broadcast),而该页面上的代码正在广播到 192.168.1.255。 -
@nick 不会发生。多播和广播数据包不会离开您的内部网络(如果这样做,它们会在到达您的 ISP 路由器的那一刻停止)。您最好的选择可能是设置一个 HTTP 服务器,您的应用程序可以定期连接到该服务器以更新您需要的任何内容。当然,如果你这样做,无论如何你都会对该地址进行硬编码,所以可能没有意义。
标签: c# network-programming udp broadcasting