2016-10-06 20 views
2

私はntohs(0x0003)をUbuntuのSOCK_RAWソケットのプロトコル引数として使用すると、PythonからOSErrorを取得します。Ubuntuでsocket.ntohs(0x0003)プロトコルとPython SOCK_RAWをどうやって使用しますか?

File "sniffer_all.py", line 44, in main 
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.ntohs(0x0003)) 
    File "/usr/lib/python3.5/socket.py", line 134, in __init__ 
    _socket.socket.__init__(self, family, type, proto, fileno) 
OSError: [Errno 22] Invalid argument 

私は、/ etc/protocolsファイルをチェックし、それがGGPとして3を示しています

... 
ggp 3 GGP  # gateway-gateway protocol 

このエラーが発生する理由は、プロトコルが設定されているかどうかは知りません。私はsudoでPythonを実行しているので、アクセスの問題はありません。

socket.ntohs(0x0003)を別のプロトコル(socket.IPPROTO_UDPなど)に置き換えると、エラーは修正されますが、ソケットで処理できるトラフィックは制限されます。

答えて

1

ローソケットを使用したいが、socket()を間違って呼び出す場合は、まずsudoまたはrootが必要です。 socket()は、のホストバイトオーダーで引数をとりますが、を呼び出すと、8ビットのGGPプロトコル値が3に変換されます。可能な最大プロトコル値は255なので、間違った16ビット値768になります。

あなたはこの

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

以上読みやすい形で

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('ggp')) 
+0

まず同じようにそれを行うことができますいずれか、これは偉大な救済である、働いていました。 –

+0

第2に、ntohs()@ https://docs.python.org/3.4/library/socket.htmlに関する文書を読んでいます。これはあなたがここで言うこととまったく同じです。しかし、どのような目的のntohs()が存在するのだろうか。 –

+1

これは、ネットワーク経由でデータを送信するときに主に使用される、バイト順を変更するために使用できる関数の1つです。詳細については、https://docs.python.org/3.4/library/socket.html#socket.ntohsおよびhttps://en.wikipedia.org/wiki/Endiannessを参照してください。 –

関連する問題