gpt4 book ai didi

c# - 在 c# 中需要有关多播 udp 服务器发现的帮助

转载 作者:太空狗 更新时间:2023-10-29 21:56:09 25 4
gpt4 key购买 nike

作为 this question 的后续行动我得到了一个可以在我的本地机器上运行的解决方案,但不能在网络上的机器上运行。

除了这些基础知识,我对套接字知之甚少,所以请多多包涵。目标是让客户端在本地网络上寻找服务器,这是一些剪切/粘贴/编辑代码的结果。

这是客户端代码:

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”)——尽管您也可以选择您所在的本地网络的广播地址,具体取决于您希望的广播地址范围广播。

关于c# - 在 c# 中需要有关多播 udp 服务器发现的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/214009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com