C# 需要c语言中多播udp服务器发现的帮助吗#
作为一种后续行动,我得到了一个在本地机器上工作的解决方案,但不是在网络上的机器上 除了这些基本知识,我对插座知道的不多,所以请耐心听我说。客户机的目标是在本地网络上查找服务器,这是一些剪切/粘贴/编辑代码的结果 这是客户端代码:C# 需要c语言中多播udp服务器发现的帮助吗#,c#,.net,udp,multicast,C#,.net,Udp,Multicast,作为一种后续行动,我得到了一个在本地机器上工作的解决方案,但不是在网络上的机器上 除了这些基本知识,我对插座知道的不多,所以请耐心听我说。客户机的目标是在本地网络上查找服务器,这是一些剪切/粘贴/编辑代码的结果 这是客户端代码: IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294); byte[] data = new byte[1024]; public Form1() {
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
byte[] data = new byte[1024];
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
string welcome = "What's your IP?";
data = Encoding.ASCII.GetBytes(welcome);
client.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)server;
data = new byte[1024];
int recv = client.ReceiveFrom(data, ref tmpRemote);
this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
this.Port.Text = Encoding.ASCII.GetString(data, 0, recv); //set textbox
client.Close();
}
这是服务器代码:
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10294);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any,IPAddress.Parse("127.0.0.1")));
while (true)
{
Console.WriteLine("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)(sender);
data = new byte[1024];
recv = newsock.ReceiveFrom(data, ref tmpRemote);
Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
string welcome = "7010";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote);
}
它可以在我的本地机器(服务器和客户端)上找到,但当我在同一网络上尝试另一台机器时,我得到“远程主机强制关闭了现有连接”
我意识到我需要添加很多try/catch,但我只是想先弄清楚它是如何工作的。我必须首先说我对C#一无所知,但是 查看客户机代码中
ipep
的定义,您似乎在尝试向自己发送数据,而不是广播数据(正如您在其他问题中所建议的那样)。引起我注意的是,“127.0.0.1”是“localhost”的地址
这可以解释为什么当您在一台机器上同时运行客户机和服务器时,它工作得很好,因为它将发送到自身
我认为正确的端点应该是广播地址(例如“255.255.255.255”)——尽管您也可以根据希望广播的广度选择您所在的本地网络的广播地址
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
应成为:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 10294);
及
应该成为
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255")));
我想
好吧,这不起作用,所以还是有点问题。是的,在你提到这一点后回头看,这是有道理的,当时(因为这主要是复制/粘贴的代码),我认为这就是我发送的地方,当然,如果我停下来再想一想,说明我从哪里发邮件是没有意义的。我要到星期一才能试用,但如果有效的话,我会+1并接受!
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255")));