6

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

それ以外のソケットについてはあまりよく知らないので、我慢してください。目標は、クライアントがローカルネットワーク上のサーバーを探すことであり、これはいくつかのカット/貼り付け/編集コードの結果です。

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

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を追加する必要があることに気づきましたが、これが最初にどのように機能するかを把握しようとしています。

4

2 に答える 2

3

私はC#について何も知らないと言って始めなければなりませんが...

クライアントコードの の定義を見ると、ipepデータをブロードキャストするのではなく、自分自身に送信しようとしているようです (他の質問で提案されているように)。気になったのは、「127.0.0.1」が「localhost」のアドレスだということです。

それは、クライアントとサーバーの両方を 1 台のマシンで実行しているときに、それ自体に送信するためうまく機能する理由を説明しています。

正しいエンドポイントはブロードキャスト アドレス (例: "255.255.255.255") であると予想されますが、ブロードキャストする範囲に応じて、現在のローカル ネットワークのブロードキャスト アドレスを選択することもできます。

于 2008-10-18T05:25:38.867 に答える
-1
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、これは機能しないので、まだ問題があります。

于 2010-03-04T20:57:51.667 に答える