2013-11-01 76 views
5

我想在Linux下用Python打開一個原始套接字。蟒蛇原始套接字:協議不支持

我簡單的代碼:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 
s.bind((HOST, 5454)) 

而且我得到了這個錯誤:

[ERROR] Protocol not supported 

順便說一句,我使用的linux下的12.04蟒蛇2.7.3,和我用root運行碼。

有沒有人有線索?

更新:我的靈魂, 由dstromberg給出的解決方案是正確的。如果你想要所有的數據包,然後使用他的解決方案。 但是,還有另一種組合

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 

也有效。

在這種情況下,您將收到所有帶有IP和TCP標頭的TCP數據包。 如果你使用dstromberg的解決方案,你也會看到以太網頭。所以這取決於你希望你的數據包有多「原始」~~

+0

FYI我運行它作爲根時得到同樣的錯誤。 – pts

+0

試試'AF_UNIX',而不是'AF_INET'。 – Anthony

+0

@Anthony,它似乎工作。不過,我得到了新的錯誤。讓我做一些測試,看看它是否有效。感謝您的建議~~~ –

回答

6

嘗試socket.AF_PACKET而不是socket.AF_INET。

+0

我試過了,我得到了「[錯誤]沒有這樣的設備」。實際上,它讓我感到困惑。 –

+1

@JerryMeng - 你在運行什麼操作系統?在具有root權限的Ubuntu 12.04上,'socket.socket(socket.AF_PACKET,socket.SOCK_RAW)'爲我工作。 –

+0

@Robᵩ那麼你如何將你的套接字綁定到主機?像s.bind((HOST,5454))?我得到了「[錯誤]沒有這樣的設備」。順便說一下,如果我使用AF_PACKET,爲什麼我不需要指定原始參數? –

0

嘗試socket.AF_UNIX,它可以解決你的問題,祝你好運。

0

這沒有錯誤以root身份運行:

#!/usr/local/cpython-3.3/bin/python 

import socket as socket_mod 

#s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 
socket = socket_mod.socket(socket_mod.AF_PACKET, socket_mod.SOCK_RAW, socket_mod.IPPROTO_IP) 
#socket.bind(('localhost', 5454)) 
socket.bind(('lo', 5454)) 
+1

事實上,我已經弄明白了。第二行不對。 5454不會給你的錯誤,沒有任何數據包。 0x0800是使用的正確端口。感謝您回答~~ –