1

サーバー情報をすべてのリスニングデバイスにブロードキャストすることになっているC#のブロードキャストビーコンに取り組んでいます。送信される情報には、WCFサービスのURL、名前空間、必要な引数のリストなどの情報が含まれます。現在私が持っているのは、同じコンピューター上にあるときに完全に正常に通信できる送信者と受信者です。ただし、送信者を受信者以外のコンピューターに配置すると、送信者はメッセージを送信しますが、受信者はメッセージを受信しません。スローされる例外はなく、ファイアウォールは両方のマシンで無効になっています。

http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/は、コードを取得した場所です。

送信者:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
            ProtocolType.Udp);
            sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
            IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050);
            byte[] data = Encoding.ASCII.GetBytes("This is a test message");
            sock.SendTo(data, iep);
            sock.Close();
        }
    }
}

受信者:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPBroadcastReciever
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork,
            SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Console.WriteLine("Ready to recieve");
            byte[] data = new byte[1024];
            int recv = sock.ReceiveFrom(data, ref ep);
            string stringData = Encoding.ASCII.GetString(data, 0, recv);
            Console.WriteLine("Received: {0} from: {1}", stringData, ep.ToString());
            sock.Close();
            Console.ReadLine();
        }
    }
}

この2人が2台の異なるコンピューターで会話できるようにするために私が見逃していることを誰かが知っていますか?それらは同じサブネット上にあります(192.168.1.x)

ありがとうニックロング

4

2 に答える 2

1

おそらく、ブロードキャストよりもマルチキャストを使用したほうがよいでしょう。ブロードキャストパケットは、ルーターによってすぐにドロップされることがよくあります。239.0.0.0/24ブロックのどこかにあるIPアドレスをマルチキャストアドレスとして選択します。これは組織のローカルメッセージ用に予約されているので、空中から番号を選んでそれを使い続けてください。

送信者にこのアドレスにパケットを送信させ、受信者にマルチキャストグループに参加させてパケットを受信させる必要があります。マルチキャストグループに参加するには、ソケットでこれを呼び出します。

sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
    new MulticastOption(theMulticastIp));

C#でのマルチキャストの使用に関する詳細については、こちらをご覧ください。

于 2012-02-23T22:44:23.200 に答える
0

私も同様の問題を抱えていましたが、ここで見たすべてのコードで何も機能していないようでした。プログラムを開始すると、ファイアウォールが一部の機能をブロックしていることを通知するポップアップウィンドウが表示されました。

私の問題は、「プライベートネットワーク、自宅または職場のネットワークとして吸う」というチェックボックスをオンにせずに[アクセスを許可]をクリックしていたことでした。もちろん、ファイアウォール設定でこれを後で変更し、そのチェックボックスをオンにすることができます。サーバーと他のマシンの両方で、そのチェックボックスをオンにする必要があります。または、少なくともそれが私の鉱山を機能させるものです。

また、ブロードキャストIPアドレスをたとえば192.168.1.255に変更する必要がありました。私のルーターは私の本で推奨されている224.0.0.0-239.255.255.255をブロックします。

于 2015-04-14T04:47:04.770 に答える