Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 套接字只捕获传出的数据包,而不捕获传入的数据包_C#_Sockets_Networking - Fatal编程技术网

C# 套接字只捕获传出的数据包,而不捕获传入的数据包

C# 套接字只捕获传出的数据包,而不捕获传入的数据包,c#,sockets,networking,C#,Sockets,Networking,我有一个包嗅探器。在实现了HTTP包之后,我注意到我接收的唯一HTTP包是请求,我没有收到任何响应 我看过很多不同的源代码,但由于使用的代码通常是相同的,我倾向于认为它可能是我自己的本地代码 当我查看日志时,我发现每个数据包都有我的本地IP作为SourceIP,既有HTTP数据包,也有到达其他端口的数据包 我提供了一个工作示例,您可以将粘贴复制到LINQPad中,并应演示该问题(添加System.Net和System.Net.Socket程序集)。不要忘记以管理员身份执行LINQPad以访问套接

我有一个包嗅探器。在实现了HTTP包之后,我注意到我接收的唯一HTTP包是请求,我没有收到任何响应

我看过很多不同的源代码,但由于使用的代码通常是相同的,我倾向于认为它可能是我自己的本地代码

当我查看日志时,我发现每个数据包都有我的本地IP作为
SourceIP
,既有HTTP数据包,也有到达其他端口的数据包

我提供了一个工作示例,您可以将粘贴复制到LINQPad中,并应演示该问题(添加
System.Net
System.Net.Socket
程序集)。不要忘记以管理员身份执行LINQPad以访问套接字

这导致192.168.0范围内有成百上千个条目,总共有3个例外的IP地址指向我的主机提供商(使用
nslookup
检查)

  • Windows 8.1
  • Killer e2200千兆以太网控制器(NDIS 6.30)-最新版本的驱动程序
    • 昨天安装了一个独立的网卡,它没有改变任何事情
的描述最接近我的问题,作为解决方案,我已经有了工作代码


为什么我只能跟踪出站数据包

您是否尝试查看您的操作系统/独立/路由器防火墙?
它经常被忽略,但防火墙对传入和传出连接有不同的规则,这可能是问题的原因。

检查GetLocalIP()返回的地址。您可能正在接收环回ip,在这种情况下,您无法捕获传入的数据包。讨论了类似的问题。

正如@Saibal和@Saverio都提到的那样:防火墙就是问题所在。现在作为一个临时解决方案,我将在packettracer启动时禁用防火墙,并在其停止时重新启用防火墙(不考虑意外退出)

如果您在这里遇到同样的问题,那么“禁用防火墙C#”的第一个结果可能是。这在我的情况下不起作用,而是抛出了一个
NotImplementedException
。我猜这只可能是在WindowsXP上显示的

幸运的是,Vista和更高版本还有其他选择(仅在Windows8.1上测试过,但据说是后续版本,并提到了这一点)

禁用/启用防火墙的我的代码:

private static readonly Type policyType = 
                          Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
private static readonly INetFwPolicy2 firewall = 
                         (INetFwPolicy2) Activator.CreateInstance(policyType);

private void DisableFirewall()
{
    var firewallEnabled = firewall.get_FirewallEnabled(
                              NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE);
    if (firewallEnabled)
    {
          firewall.set_FirewallEnabled(
                       NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE, false);
    }
}
另一种写作方式是

firewall.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE] = false;
遗憾的是,MSDN只提供了一些功能,但你仍然可以把它的要点拿走

请记住,您必须将Interop.NetFwTypeLib库添加到项目中。您可以在C:\Windows\SysWOW64\FirewallAPI.dll或32位等效文件中找到它


然而,这是非常基本的。在以后的阶段(我会随时更新这篇文章),我会考虑简单地将程序添加到防火墙的例外列表中,但现在这就足够了。

返回的IP是
192.168.0.199
。啊!!!这是防火墙。关闭防火墙可以让它正常工作。需要找出防火墙所需的配置,以使事情正常工作。要快速测试,请禁用防火墙。至少对我有效:)事实上,它在这里似乎也有效。当我将LINQPad添加到允许进入连接的程序列表中时,它也在启用防火墙的情况下工作。这是一个很好的进步。。我从未想过简单地关闭它,看看会发生什么,我只是在查看设置。我很高兴我能提供帮助:)
firewall.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE] = false;