2013-02-23 55 views
3

我在Linux 2.6.38上使用Python 2.7写了一个简单的UDP聊天服务器。在Python中的UDP套接字上接收ICMP主机无法访问的消息

当一个主机(客户端)发送UDP段来接收一个无法访问的服务器时,如何读取ICMP错误消息?

我试图

sockFd.setsockopt(socket.IPPROTO_IP, socket.IP_RECVERR, 1) 

socket.IP_RECVERR插座模块定义。

我试过在sockFd.recvfrom上使用超时,并且第二次做sendto但这并没有帮助。是否有API读取主机收到的ICMP错误?

回答

2

这个问题有点老,但我会回答它,因为我面临同样的问题。

常量IP_RECVERR是 “IN” 模块中定义,所以下面的语句应该做的工作:

import socket 
import IN 
sockFd.setsockopt(socket.IPPROTO_IP, IN.IP_RECVERR, 1) 
-1

ICMP错误基本上是无用的。如果您收到错误,则不能保证另一端没有收到数据包。如果您没有收到错误,则不能确保另一端收到数据包。所以几乎没有理由不打扰这样做。

如果您告诉我们更多关于您认为需要这样做的原因,我们可以告诉您应该做些什么。

+0

+1。而且,并非所有主机都会发送ICMP。 NAT和防火墙也可能会以静默方式丢弃数据包。 – selbie 2013-02-23 04:45:32

+0

我已经在服务器上安装了iptables,以便它发回ICMP主机不可达消息,以便收到任何UDP消息。所以,我试图在客户端验证这种行为。 – crk 2013-02-23 09:46:22

+1

这并没有回答原来的问题。你如何应对'socket.IP_RECVERR'的缺失? – 2013-11-05 16:55:40