我正在写一个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通过?
谢谢你,让我走上正轨。 – bbuggy 2013-04-24 13:49:28
我意外地指出绑定到错误的sockaddr结构。我将它绑定到服务器ip上的端口137。将其更改为正确的sockaddr实例会使ICMP消息消失。我想我的问题解决了。 – bbuggy 2013-04-24 13:58:08
当你终于明白时,事情会变得如此简单。我最后的评论是不正确的。我认为我的程序应该监听端口137,为了实现这个目的,我做了两个struct sockaddr_in,其中一个服务器端口为137,另一端为客户端ip和端口137.我使用第一个为socket,第二个为绑定。这是错误的。我现在使用第一个套接字和绑定。这解决了问题。 – bbuggy 2013-04-24 14:27:41