2013-04-24 45 views
0

我正在写一个C程序来搜索本地网络上的smb共享并挂载它们。 获取找到的smb服务器的主机名我发送一个udp nbns数据包到服务器。 数据包正确,服务器回复。 我正在使用wireshark来检查这一点。 我比较了我发送的数据包和nbstat发送的数据包,我还比较了服务器返回的数据包。 exept为id和校验和他们是相同的。回复udp数据包被阻止

当我使用nbstat做出请求时,回复数据包被正确接收,但对自己数据包的回复可能被防火墙阻止。 客户机收到服务器的回复后,会向服务器发送icmp“Destination unreachable(Port unreachable)”消息。 我怀疑我的防火墙发送它。

这是从Wireshark的

号时间源目标协议长度信息
12 29.870065 192.168.1.245 192.168.1.21 NBNS 92名称查询NBSTAT * < 00> 00 <输出.......
13 29.870494 192.168.1.21 192.168.1.245 NBNS 253名称查询响应NBSTAT
14 29.870559 192.168.1.245 192.168.1.21 ICMP 281目的地不可达(端口不可达)

我应该怎么做,以便将R eply通过?

回答

1

您的程序是否在UDP端口137上侦听以接收服务器回复? 如果不这样解释您的主机为什么发送ICMP数据包端口无法访问。

如果您在端口137上侦听,请尝试在发送NBNS查询为端口137时配置源端口。因此防火墙现在应该让数据包到达此端口。

+0

谢谢你,让我走上正轨。 – bbuggy 2013-04-24 13:49:28

+0

我意外地指出绑定到错误的sockaddr结构。我将它绑定到服务器ip上的端口137。将其更改为正确的sockaddr实例会使ICMP消息消失。我想我的问题解决了。 – bbuggy 2013-04-24 13:58:08

+0

当你终于明白时,事情会变得如此简单。我最后的评论是不正确的。我认为我的程序应该监听端口137,为了实现这个目的,我做了两个struct sockaddr_in,其中一个服务器端口为137,另一端为客户端ip和端口137.我使用第一个为socket,第二个为绑定。这是错误的。我现在使用第一个套接字和绑定。这解决了问题。 – bbuggy 2013-04-24 14:27:41