亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

發送 UDP 到本地服務器,但不通過環回接口

發送 UDP 到本地服務器,但不通過環回接口

胡說叔叔 2022-01-18 16:03:44
我最終試圖測試一個 UDP 客戶端,并希望確保它在不通過環回接口發送數據時工作,以避免由此引入的任何細微問題,例如校驗和驗證的差異(Bad UDP checksum 無效:為什么?)。但是,即使將數據發送到不是 的結果socket.gethostbyname(socket.gethostname()),127.0.0.1根據 Wireshark 的說法,數據似乎也是通過環回接口進行的。以下程序b'somedata'成功發送和接收,并從 Wireshark 捕獲以下內容。import asyncioimport socketasync def server():    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:        sock.setblocking(False)        sock.bind(('', 4567))        data = await loop.sock_recv(sock, 512)        print('Received', data)async def main():    local_ip = socket.gethostbyname(socket.gethostname())    print('Local IP', local_ip)  # Outputs 192.168.0.34    asyncio.ensure_future(server())    await asyncio.sleep(0)    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:        sock.setblocking(False)        sock.connect((local_ip, 4567))        await loop.sock_sendall(sock, b'somedata')        await asyncio.sleep(1)loop = asyncio.get_event_loop()loop.run_until_complete(main())loop.close()如何將數據從本地運行的客戶端發送到本地運行的服務器,但避免環回接口并實際將數據發送到網絡?理想情況下,答案將適用于 Linux 和 macOS。
查看完整描述

2 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

要“說服”網絡堆棧使用以太網(或 WiFi)卡而不是環回來物理傳輸幀,請使用廣播地址。


我已經在我的 Linux 系統上以這種方式成功發送和接收了一個 UDP 數據包。我用tcpdump. 它在以太網接口上顯示一個數據包,并且在環回上沒有活動。


我使用了文字廣播地址。套接字模塊文檔還提到了字符串作為'<broadcast>'特例地址。我沒有試過。


with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:

    sock.setblocking(False)

    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

    sock.connect(('192.168.0.255', 4567))

    await loop.sock_sendall(sock, b'somedata')

    await asyncio.sleep(1)

筆記:

  1. 同一網絡上的其他主機也會收到 UDP 數據包。

  2. 確保防火墻/數據包過濾器(例如 Linux iptables/nftables)不會阻止數據包。

  3. 關于setsockoptPython socket.error: [Errno 13] Permission denied


查看完整回答
反對 回復 2022-01-18
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

這可能是因為您的主機名指向環回地址,因此socket.gethostbyname(socket.gethostname())會產生127.0.0.1

您需要做的是取消從主機名指向環回地址的操作:

  • 在 Linux 中編輯/etc/hosts并注釋掉該行127.0.0.1 YOUR_HOSTNAME

  • 在 Windows 中,您應該擁有c:\windows\system32\drivers\etc\hosts類似于 Linux 的

在此之后,如果您調用socket.gethostbyname(socket.gethostname())它,它將產生您的 DHCP 分配的 IP。

即使在這種情況下,調用 from youriptoyourip也可能導致網絡驅動程序通過環回接口路由包。另一種方法是在網絡路由器之外使用公共 IP。您可以使用此答案中描述的外部服務


查看完整回答
反對 回復 2022-01-18
  • 2 回答
  • 0 關注
  • 254 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號