2013-11-01 31 views
5

LinuxでPythonでrawソケットを開こうとしています。Python raw socket:プロトコルがサポートされていません

私の簡単なコード:

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

そして、私はこのエラーを得た:ところで

[ERROR] Protocol not supported 

を、私は、Linux 12.04下のpython 2.7.3を使用しています、と私は実行するには、rootを使用コード。

誰か手掛かりがありますか?

アップデート:私のsoultion、dstrombergによって与えられた ソリューションは正しいです。すべてのパケットが必要な場合は、彼のソリューションを使用してください。 しかし、別の組み合わせがあります。

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

もあります。この場合

、あなたはそれにIPおよびTCPヘッダを持つすべてのTCPパケットを受信します。 dstrombergのソリューションを使用している場合は、イーサネットヘッダーも表示されます。だから、それはあなたがあなたのパケットが~~

+0

ルートとして、それを実行しているときFYI私は同じエラーを取得します。 – pts

+0

'AF_INET'の代わりに' AF_UNIX'を試してください。 – Anthony

+0

@Anthony、それは仕事のようです。私は新しいエラーを得ました。私はいくつかのテストを行い、それが動作するかどうかを見てみましょう。アドバイスありがとう~~~ –

答えて

6

なりたいか「生」に依存socket.AF_PACKETの代わりはsocket.AF_INETを試してみてください。

+0

私は試しましたが、 "[エラー]そのようなデバイスはありません"。それは実際に私を混乱させた。 –

+1

@ JerryMeng - どのOSで実行していますか? Ubuntu 12.04では、root特権で 'socket.socket(socket.AF_PACKET、socket.SOCK_RAW)'が働いてくれました。 –

+0

@Robᵩあなたのソケットをホストにどのようにバインドしますか? s.bind((HOST、5454))のように?私は「[エラー]そのようなデバイスはありません」を得ました。そして、ところで、私がAF_PACKETを使うと、どうしてproto引数を指定する必要はありませんか? –

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

実際、私はそれを理解しました。そして2番目の行は正しくありません。 5454はあなたのエラーを通知しません。 0x0800は正しいポートです。答えてくれてありがとう~~ –

関連する問題