2017-04-02 88 views
0

我有一個非常標準的udp數據包簡單的演示,但我試圖發送到另一個IP地址時出現錯誤,我不明白爲什麼。發送UDP從一臺計算機到另一個在python

socketerror: [Errno 22] Invalid argument

,我認爲會的工作代碼基本上是....

服務器

def Main(): 
    host = '0.0.0.0' 
    port = 20030 

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s.bind((host,port)) 

    #Then it prints incoming data and sends it back to client. 
    data,addr = s.recvfrom(1024) 
    s.close() 

客戶

def Main(): 
    host = '127.0.0.1' 
    port = 20020 

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s.bind((host,port)) 
    server = ('10.20.64.115', 20030) 

    #loop for input to send to server. 
    s.sendto(message, server) 
    s.close() 

如果我在同一臺計算機上運行它們都和主機= 127.0.0.1,兩者都綁定到127.0.0.1和s.sendto(消息,服務器)發送到127.0.0.1他們可以發送消息回來,沒有問題。

如果我在不同的計算機上運行它們,我相信我應該使用客戶端發送到服務器IP地址的IP地址,但是我得到[Errno 22]。

所以我試圖綁定客戶端到192.0.0.1,它給了一個[Errno 99]不能分配請求的地址。

我試着將客戶端綁定到0.0.0.0,將sendto地址綁定到10.20.64.115,但客戶端只是返回到一個新行,服務器沒有看到任何東西。

所有的教程都說要綁定併發送到127.0.0.1,所以我將兩臺計算機都設置爲這樣,它也不會顯示在服務器中。

所以我現在都很困惑。糾正任何誤解......

綁定(你要聽IP地址,端口,你要聽)

的sendto(你要發送到的消息,IP地址,端口要發送到)

0.0.0.0正在收聽所有內容。

192.0.0.1正在監聽路由器。

127.0.0.1正在收聽電腦。

如果是的話我需要發送什麼ip地址來避免errno 22併成功發送消息到服務器?或者我是否錯過了插座?

+0

哪行代碼產生錯誤?這是蟒蛇2還是蟒蛇3?當你得到錯誤時,'message'的值是多少? –

+0

@jJames K Polk客戶端中的sendto行出現錯誤。兩者都使用2.7版本。消息的值通常只是包含幾個字符的字符串。 「測試」或類似的東西。 – cba1067950

+0

你完全失去了點! 'UDP服務器使用2端口'第一次聽發送。在你的代碼serveron端口= 20030和客戶端端口= 20020,連接/服務? – dsgdfg

回答

-1

bind(ip address you want to listen to, port you want to listen to)

雖然發送UDP數據包,在客戶端,它不需要bind()將其套接字連接到一個地址,你可以直接使用sendto()recvfrom()從服務器發送和接收消息。請參閱here瞭解更多詳情

+0

這是否說明他收到的錯誤? –

+0

我不這麼認爲。我刪除了綁定,並使用sendto。它不會給我errno 22,但會跳到下一行,並且發送的消息永遠不會顯示在服務器中。 – cba1067950

+0

@JamesKPolk我剛剛意識到,當它跳到下一行時,它沒有被破壞或正在等待服務器響應的錯誤。我沒有包括的部分循環是服務器發回消息。所以在這種情況下,errno 22不是問題,但消息永遠不會到達服務器,這正是我想要解決的問題。但我發現客戶端綁定不是問題。所以errno 22可能不是真正的問題。這是發送什麼IP地址的問題。我仍然不明白髮生了什麼。 – cba1067950

相關問題