2017-04-10 278 views
1

現在、私はJavaからPythonを学んでいて、エラーに遭遇しました。私はWindows 10上で最新のpythonバージョンを使用していますが、私はその後のチュートリアルはLinux用であると仮定しています...あなたがまだ私を助けてくれることを願っています。実行にOSError:[WinError 10022]無効な引数が指定されました - Windows 10 Python

def main(): 
    connection = socket.socket(socket.AF_INET, socket.SOCK_RAW, 
    socket.IPPROTO_IP) 

    #mainloop 
    raw_data, addr = connection.recvfrom(65536) 
    dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data) 
    print('\nEthernet Frame:') 
    print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, 
    src_mac, eth_proto)) 

#unpack ethernet frame 
def ethernet_frame(data): 
    dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14]) 

    return get_mac_addr(dest_mac), get_mac_addr(src_mac), 
    socket.htons(proto), data[14:] 

#format MAC adress 
def get_mac_addr(bytes_addr): 
    bytes_str = map('{:02x}'.format, bytes_addr) 

    return ':'.join(bytes_str).upper() 

main() 

私はエラー、次の受信: "connection.recvfrom(65536)" に沿って

OSError: [WinError 10022] An invalid argument was supplied 

これが私のclasscodeです。

とにかくLinuxですぐにVMを取得しようとしていたのですが、それを待たなければならないのでしょうか、それともWindowsにも良い解決策がありますか?

+0

TCPまたはUDPソケットが必要ですか? 'recvfrom'は一般的にUDP用ですが、あなたはTCPを作っています。 – fuzzything44

+0

正直言って、私は知りません...これはスニファチュートリアルのものですが、最も理にかなっていますか?そして、どのような解決方法が最も良いのでしょうか?申し訳ありませんが、私は本当にこれに新しいです。 –

+0

私はそれを読んでいますが、UDPは高速で信頼性が低いのに対して、TCPは遅く、より信頼性があります。 UDPはパケットベースであるのに対して、TCPはファイルのようにアクセスされます。 – fuzzything44

答えて

1

ソケットにバインドされているかデータが送信されるまで、ソケットにはアドレスがありません。 connection.bind((YOUR_IP, PORT))を使用してconnection.recvfrom(65536)を呼び出す前に、ソケットをバインドしてください。

+0

その時点で、あなたは 'recvfrom'を行う必要はないことに注意してください。' recv'はIPとポートを知っているので同様に動作します。 – fuzzything44

+0

ありがとう!それを持って:)まだ変わった、チュートリアルでは、ソケットをバインドする必要はありませんでした... –

関連する問題