平台:Windows 2003 R2,C#
我有一个应用程序将UDP消息发送到自身的其他实例,在同一台计算机和其他计算机上运行。这工作正常。但是,在某些计算机上,侦听器无法听到同一计算机上的其他线程/进程已传输的消息。消息广播正常,网络上的其他计算机听到消息,但同一台计算机上的监听器听不到消息。
奇怪的是,这种情况发生在我的测试环境中的某些机器上,但不是全部。
编辑:所有失败的计算机都安装了Check Point VPN-1 Securemote客户端软件。我拿了一台正在运行的机器,安装了VPN客户端,现在它无法正常工作。请注意,我没有连接到任何VPN主机,我只安装了客户端。
所有计算机都有一个网络适配器,子网掩码为255.255.255.0,IP地址为10.3.10.xxx。
这是一个演示此问题的测试类。用户键入一些文本,然后将其发送到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;
}
答案 0 :(得分:1)
Check Point VPN-1 Securemote客户端软件有何功能?听起来它可能会做某种防火墙,在这种情况下,它会阻止数据进入指定的端口。
1)如果您可以将其配置为允许通过该端口的数据,那么您应该很高兴。
2)另一个不太可能的选择是,它可能正在侦听您正在尝试收听的端口,在这种情况下,它正在接收udp数据包,而不是您的应用程序。我希望你的应用程序在这种情况下会抛出一个错误。
答案 1 :(得分:0)
在SecureClient设置中(右键单击托盘图标并选择“设置”),在“安全”选项卡上,您可以启用“记录桌面安全策略阻止的所有连接”选项。
然后您应该能够看到这是否确实阻止了您的应用程序 - 如果是,您将必须更改默认策略以允许您的应用程序。我不知道该怎么做 - 我从未管理过SecureRemote的服务器端,但我确信Check Point可以帮助你,如果你的网络管理员不能。