プラットフォーム: 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;
}