簡體   English   中英

如何將 TCP 端口/套接字路由到 QEMU 內部?

[英]How to route TCP ports/sockets internal to QEMU?

我正在嘗試運行FreeRTOS+TCP 演示(版本 10.1.1):

該代碼是為 Windows 模擬器編寫的,但我試圖以 Xilinx Zynq 為目標,由QEMU (4.2.0 版)模擬。 主機為 Ubuntu 16.04。 FreeRTOS+TCPTCP部分存在一個網絡接口端口,所以這應該是可能的。

對演示的明顯修改之一是更改消息的打印方式,並刪除對 Windows Sleep function 的調用。 另外,我正在使用ARM 半主機來查看打印語句的 output。

除了這些更改之外,我還需要對命令行調用進行哪些更改? 該演示創建了一個 TCP 回顯服務器和客戶端。 如果這些都捆綁在一起,那么應該沒有流量需要到 go 到主機,對吧? 有什么特別的事情我需要做才能讓它工作嗎? 我沒有大量的網絡經驗。

因為這在技術上是一個裸機應用程序,所以像-nic user,hostfwd=tcp::5022-:22這樣的 CLI 選項會給出警告qemu-system-arm: warning: nic cadence_gem.1 has no peer. (在如何替換 `qemu-system -redir` 命令參數? )。

如果我確實想在主機和來賓之間發送流量(比如擁有一個ncat回顯服務器,而不是在 FreeRTOS 中),我將如何 go 這樣做?

這是一個相關的問題,沒有解決方案: Running LWIP TCP/IP Stack with QEMU

當前命令行 arguments:

qemu-system-arm -semihosting --semihosting-config enable=on,target=native -nographic -serial mon:stdio -machine xilinx-zynq-a9 -m 512M -cpu cortex-a9 -nic user,hostfwd=tcp::12346-:7 -kernel build/rtos_demo_tcp/rtos_demo_tcp.elf

當前 output(我啟用了額外的調試消息):

qemu-system-arm: warning: nic cadence_gem.1 has no peer
Seed for randomiser: 1591112953
Random numbers: 00001294 00001925 000022D0 00005CC3
FreeRTOS_IPInit
vTaskStartScheduler
prvIPTask started
Network buffers: 30 lowest 30


IP Address: 10.2.118.223
Subnet Mask: 255.255.255.0
Gateway Address: 10.2.118.1
DNS Server Address: 208.67.222.222


Socket 7 -> 0ip:0 State eCLOSED->eTCP_LISTEN

然后下一位無限重復,每次使用不同的套接字號:

FreeRTOS_connect: 14207 to a0276dfip:7
Socket 14207 -> a0276dfip:7 State eCLOSED->eCONNECT_SYN
ARP for a0276dfip (using a0276dfip): rc=0 00:00:00 00:00:00
Network buffers: 30 lowest 29
Connect[a0276dfip:7]: next timeout 1: 500 ms
ARP for a0276dfip (using a0276dfip): rc=0 00:00:00 00:00:00
Connect[a0276dfip:7]: next timeout 2: 500 ms
ARP for a0276dfip (using a0276dfip): rc=0 00:00:00 00:00:00
Connect[a0276dfip:7]: next timeout 3: 500 ms
Connect: giving up a0276dfip:7
Socket 14207 -> a0276dfip:7 State eCONNECT_SYN->eCLOSE_WAIT
FreeRTOS_closesocket[14207 to a0276dfip:7]: buffers 30 socks 1

總結:如何改變我調用QEMU的方式,讓TCP客戶端和服務器可以互相連接?

我建議嘗試qemu 網絡指南中列舉的所有選項:
- SLIRP : -netdev user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9
- TAP-netdev tap,id=mynet0
- SOCKET-netdev socket,id=mynet0,listen=:1234-netdev socket,id=mynet0,connect=:1234

指南中還有更多內容。 您可能還考慮的是,您可能很難直接從您關心的 VM 端口轉發到主機,並且可能更容易將該 VM 連接到另一個 VM並將第二個 VM 端口轉發到您的主持人。

聽起來有點奇怪,但這是我以前需要做的事情。 在兩個 VM 之間進行交談,我發現sockets是最好的方法。 它們的工作方式有點像“虛擬交叉電纜”。

這種 VM 到 VM 方法將允許您只需要在每個 VM 上設置相應的 static IP 和子網,然后ncat就可以在它們之間工作。 消除 DHCP 服務器的所有復雜性和任何類型的端口轉發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM