2013-02-23 51 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