作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想为我的客户端/服务器应用程序实现 UDP ping,其中客户端将 UDP 数据包发送到服务器的任何临时端口以尝试获得 ICMP 端口无法访问的回复。
我有以下代码。 ReadFromUDP() 返回错误 = nil 和从套接字读取的 0 字节。
问题是,如何从服务器读取特定端口无法访问的 ICMP 回复?
conn, _ := net.ListenUDP("udp4", src)
defer conn.Close()
t := time.Now()
conn.SetDeadline(t.Add(100 * time.Millisecond))
conn.SetReadDeadline(t.Add(250 * time.Millisecond))
w, e := conn.WriteTo([]byte("PING"), dst)
if e != nil {
return nil, errors.New("Failed to send UDP4 ping request")
}
r, _, e := conn.ReadFromUDP(b4)
if e != nil {
return nil, errors.New("Failed to read UDP4 response packets")
}
最佳答案
检查类型 3、代码 3(端口不可达)回复消息的前 2 个字节:
引用RFC792 :
Destination Unreachable Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP Fields:
Destination Address
The source network and address from the original datagram's data.
ICMP Fields:
Type
3
Code
0 = net unreachable;
1 = host unreachable;
2 = protocol unreachable;
3 = port unreachable;
4 = fragmentation needed and DF set;
5 = source route failed.
关于sockets - UDP ping - 尝试获取端口不可达错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19107826/
有点迷茫.. 在git community manual , 它说 The git log command can show lists of commits. On its own, it show
我是一名优秀的程序员,十分优秀!