2017-04-10 316 views
1

我目前正在學習python,來自java,並偶然發現錯誤,我找不到答案。我正在使用Windows 10上的最新Python版本,但我認爲我所遵循的教程是針對Linux的......希望您仍然可以幫助我。這是我的classcode: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() 

在執行時,我收到以下錯誤:

OSError: [WinError 10022] An invalid argument was supplied 
與 「connection.recvfrom(65536)」 行

無論如何,我很快就會用Linux獲得虛擬機,我應該等一下,還是有Windows的好解決方案?

+0

你想要一個TCP或UDP套接字嗎? 'recvfrom'通常用於UDP,但你正在製作一個TCP。 – fuzzything44

+0

說實話,我不知道......這是來自一個嗅探器教程,最有意義的是什麼?哪種解決方案最適合?對不起,我真的很新鮮。 –

+0

我會讀它,但TCP更慢,更可靠,而UDP更快,更不可靠。 TCP也是更像文件訪問,而UDP是基於數據包的。 – fuzzything44

回答

1

套接字在發送綁定數據或發送數據之前沒有地址。在使用connection.bind((YOUR_IP, PORT))致電connection.recvfrom(65536)之前綁定套接字。

+0

請注意,在那時您不需要執行'recvfrom',因爲'recv'將會起作用,因爲您知道IP和端口。 – fuzzything44

+0

謝謝!得到它:)仍然很奇怪,如何在教程中沒有必要綁定套接字... –