4

プラットフォーム: Windows 2003 R2、C#

同じコンピューターと他のコンピューターで実行されている、それ自体の他のインスタンスに UDP メッセージを送信するアプリケーションがあります。これはうまくいっています。ただし、一部のコンピューターでは、リスナーは、同じコンピューター上の他のスレッド/プロセスが送信したメッセージを聞くことができません。メッセージは正常にブロードキャストされ、ネットワーク上の他のマシンはメッセージを聞きますが、同じマシンのリスナーはメッセージを聞くことができません。

奇妙な部分は、これが私のテスト環境の一部のマシンで発生することですが、すべてではありません。

編集: 失敗したすべてのマシンには、Check Point VPN-1 Securemote クライアント ソフトウェアがインストールされています。動作していたマシンに VPN クライアントをインストールしましたが、動作しなくなりました。VPN ホストには接続していないことに注意してください。クライアントをインストールしただけです。

すべてのマシンには、1 つのネットワーク アダプター、255.255.255.0 のサブネット マスク、および 10.3.10.xxx の IP アドレスがあります。

問題を示すテスト クラスを次に示します。ユーザーがテキストを入力すると、それが 10.3.10.255 に送信されます。ReceiveFrom が返されるマシンもあれば、返されないマシンもあります。Controller("10.3.10.255",33333) を呼び出しています

public class Controller
{
    public Controller(IPAddress broadcastAddress, int port)
    {
         _broadcastAddress = broadcastAddress;
         _port = port;
    }

    public void Start()
    {
        Socket s = null;

        try
        {
             IPEndPoint _listenEndpoint = new IPEndPoint(IPAddress.Any, _port);
            _broadcastEndpoint = new IPEndPoint(_broadcastAddress, _port);

            s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
            s.EnableBroadcast = true;
            s.Bind(_listenEndpoint);

            SocketState receiveState = new SocketState();
            receiveState.s = s;
            receiveState.buf = new byte[1024];

            EndPoint lep = (EndPoint)_broadcastEndpoint;

            s.BeginReceiveFrom(receiveState.buf, 0, receiveState.buf.Length, SocketFlags.None, ref lep, new AsyncCallback(OnReceive), receiveState);

            bool done = false;
            while (!done)
            {
                string msg = Console.In.ReadLine();
                byte[] msg_bytes = Encoding.ASCII.GetBytes(msg);

                if (msg_bytes.Length == 0)
                    done = true;
                else
                {
                    Console.Out.WriteLine("---> {0}", msg);
                    s.SendTo(msg_bytes, msg_bytes.Length, SocketFlags.None, new IPEndPoint(_broadcastAddress, _port));
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            if (s != null)
                s.Close();
        }
    }

    internal void OnReceive(IAsyncResult ar)
    {
        SocketState state = ar.AsyncState as SocketState;
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
        EndPoint ep = (EndPoint)ipep;

        int nRead = state.s.EndReceiveFrom(ar, ref ep);

        IPEndPoint myipep = ep as IPEndPoint;

        Console.WriteLine("<--- {0} {1}", myipep.Address.ToString(), System.Text.Encoding.ASCII.GetString(state.buf, 0, nRead));

        EndPoint lep = (EndPoint)_broadcastEndpoint;
        state.s.BeginReceiveFrom(state.buf, 0, state.buf.Length, SocketFlags.None, ref lep, new AsyncCallback(OnReceive), state);
    }

    IPAddress _broadcastAddress;
    int _port = 0;
    IPEndPoint _broadcastEndpoint;
}

internal class SocketState
{
    internal Socket s;
    internal byte[] buf;
}
4

2 に答える 2

1

Check Point VPN-1 Securemote クライアント ソフトウェアは何をしますか? ある種のファイアウォールを実行している可能性があるように思えます。その場合、指定されたポートで着信するデータがブロックされます。

1)そのポートを介したデータを許可するように構成できる場合は、問題ありません。

2)別の可能性が低いオプションは、リッスンしようとしているポートでリッスンしている可能性があることです。この場合、アプリケーションではなくudpパケットを受信して​​います。その場合でも、アプリがエラーをスローすることを期待しています。

于 2009-09-16T20:47:54.373 に答える
0

SecureClient の設定 (トレイ アイコンを右クリックして [設定] を選択) の [セキュリティ] タブで、「デスクトップ セキュリティ ポリシーによってブロックされたすべての接続をログに記録する」オプションを有効にできます。

それが実際にアプリケーションをブロックしているものかどうかを確認できるはずです。ブロックしている場合は、アプリケーションを許可するようにデフォルト ポリシーを変更する必要があります。その方法がわかりません.SecureRemoteのサーバー側を管理したことはありませんが、ネットワーク管理者ができない場合はチェックポイントが役立つと確信しています.

于 2009-09-17T00:55:03.257 に答える