0

我在基于 C# .NET 套接字的应用程序的发送端运行了这段代码:

const int port = 1110;
System.Net.Sockets.UdpClient udp = null;

udp = new System.Net.Sockets.UdpClient(host, port);
...
byte[] data = m.Serialize();
udp.Send(data, data.Length);

我在接收端运行了这段代码:

System.Net.IPEndPoint replyAddress = new System.Net.IPEndPoint(
    System.Net.IPAddress.Any, port);
while ((udp != null) && (udp.Available > 0))
{
   ...
}

我在 UDP 端口 1110 的接收端添加了一个例外(Windows 7)防火墙。但是,除非我完全禁用防火墙,否则接收端代码永远不会进入 while 循环。为什么1110端口异常不生效?使用 Microsoft 网络监视器,我可以看到试图进入端口 1110 的消息,其描述如下UDP:SrcPort = 1082, DstPort = 1110, Length = 11(我认为网络监视器会看到本地网络上的所有消息,而不仅仅是那些通过防火墙并发往本地系统的消息),但是除非我完全禁用防火墙,否则我的应用程序永远不会收到它们。

我怎样才能弄清楚这里发生了什么或修复它?我可以在循环内设置断点,让对方发送数据,当我禁用防火墙的那一刻,我命中了断点,所以我知道流量可以通过,但是防火墙的某些东西阻止了它。我的防火墙异常如下所示:

一般的

  • 启用:真
  • 行动:允许连接

计划和服务

  • 所有满足指定条件的程序
  • 适用于所有计划和服务

电脑

  • (未选中且为空)仅允许来自这些计算机的连接
  • (未选中且为空)跳过此规则以获取来自这些计算机的连接

协议和端口

  • 协议类型:UDP
  • 协议编号:17
  • 本地端口:特定端口
  • 端口:1110
  • 远程端口:所有端口

范围

  • 本地IP地址:任何IP地址
  • 远程IP地址:任何IP地址

先进的

  • 指定适用此规则的配置文件:域、私有、公共(全部选中)
  • 边遍历:允许边遍历

用户

  • 授权用户:(未选中且为空)仅允许来自这些用户的连接
  • 例外:(未选中且为空)为来自这些用户的连接跳过此规则
4

1 回答 1

1

After further searching of the firewall rules I discovered there was another rule to explicitly block the receiving program based on its path. When Windows pops up a message about a program wanting network access, I guess you have to be careful about how you respond. I intended to temporarily disallow access or cancel the operation (I hadn't intended to run the program yet at the time). But once my response was taken, Windows added a rule to permanently block all access by that program. Deleting those rules allowed the UDP communication to get through the firewall as expected.

于 2012-12-16T21:49:01.123 回答