C#でのマルチキャストUDPサーバー検出に関するヘルプが必要
質問
この質問ローカルマシンで動作するソリューションを取得しましたが、ネットワーク上のマシンでは動作しません。
基本以外のソケットについてはあまり知りませんので、ご容赦ください。目標は、クライアントがローカルネットワーク上のサーバーを探すことであり、これは切り取り/貼り付け/編集コードの結果です。
これはクライアントコードです:
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"のアドレスです。
それは、クライアントとサーバーの両方を1台のマシンで実行している場合、 自身に送信されるため、なぜうまく機能するのかを説明します。
正しいエンドポイントはブロードキャストアドレス(例:" 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("127.0.0.1")));
なるはず
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255")));
私は思う。
OK、これは機能しないので、何かがまだ間違っています。