質問

この質問ローカルマシンで動作するソリューションを取得しましたが、ネットワーク上のマシンでは動作しません。

基本以外のソケットについてはあまり知りませんので、ご容赦ください。目標は、クライアントがローカルネットワーク上のサーバーを探すことであり、これは切り取り/貼り付け/編集コードの結果です。

これはクライアントコードです:

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、これは機能しないので、何かがまだ間違っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top