2013-01-08 73 views
0

如何使用python標準庫函數在OS X(或BSD)上執行ip-address/netmask等查找。我正處在一個進程的中間,無法讓我的腳本在Mac上運行。在Linux機器上,它非常簡單:BSD/OS X上的掩碼/ IP地址查找

ifname = "eth0" 
SIOCGIFNETMASK = 0x891b 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
socket.inet_ntoa(fcntl.ioctl(s.fileno(), SIOCGIFNETMASK, struct.pack('256s', ifname))[20:24]) 

例如,它返回網絡掩碼。在OS X上,我得到Operation not supported on socket錯誤:

>>> import socket, fcntl, struct 
>>> ifname = "en0" 
>>> SIOCGIFNETMASK = 0x891b 
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
>>> socket.inet_ntoa(fcntl.ioctl(s.fileno(), SIOCGIFNETMASK, struct.pack('256s', ifname))[20:24]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 102] Operation not supported on socket 
>>> 

貌似SIOCGIFNETMASK,SIOCGIFADDR等偏移是在BSD/OS X系統不同。任何想法如何解決這個問題?已經在同一類問題上發現了幾篇文章,但沒有得到明確的答案。任何投入將不勝感激。提前致謝。乾杯!!

+0

有趣svnweb.freebsd.org/base?view=revision&revision=230207 – Satish

回答

0

我沒有BSD系統來嘗試,但希望它應該工作

socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', iface))[20:24]) 
+0

我已經嘗試過'35099'但同樣的錯誤上無論如何感謝OS X. – MacUsers

+0

您是否嘗試過SIOCSIFNETMASK 0x891c? – Satish

+0

你是否也試過SOCK_STREAM而不是SOCK_DGRAM?只是好奇而已 – Satish