Visual Studio Emulator for Android出現Couldn't set up UDP port

  • 167
  • 0

之前在使用Emulator時不知道為什麼碰上了Couldn't set up UDP port的問題

Emulator – UDP set up錯誤

稍微做了點功課,看了一些相關的討論後想把它紀錄下來~

 

這篇文章中除了解決UDP Port Set up這個問題外,最主要是想介紹Hyper-V中的三種不同Switch,中間也摻雜了一些跟實體網路設備相關的介紹。

如果想要快速跳到介紹三種Switch的部分,請點我

 

其實所謂的Emulator實際上就是一台虛擬機器(VM),而又因為Visual Studio Emulator for Android是MS的軟體,所以它實際上是使用Hyper-V來建立及管理這些虛擬機器的。

附帶一提,從Windows 8開始系統便內建Hyper-V,但是你的版本必須是Pro(專業版)以上才有,而且你必須要在"程式與功能"中的"開啟或關閉Windows功能"找到Hyper-V的選項,並且安裝。

程式與功能 – 開啟或關閉Windows功能

 

回到正題,其實要解決這個問題很簡單,只要確認你對於Emulator的虛擬網路介面卡、虛擬交換器等等設定正常就沒問題了,照理來說Hyper-V在開啟虛擬機時(Emulator)時,會自動幫我們做好設定,但可能因為在設定之後,你做了某些網路介面卡的變更,導致原本的設定出了問題,所以最簡單的方法就是把Emulator相關的網路介面卡全部刪除,再讓Emulator重新跑一次Set up即可,如果還是不行,那問題可能就是出在你電腦實體網路卡的身上了,或是看錯誤訊息Case by Case了。

參考R-1或R-9

 

而在刪除這些網路介面卡、交換器等等前,稍微來了解一下它們到底是什麼東西。

  • 網路介面控制器(Network Interface Controller,NIC),也可稱呼為網路介面卡(Network adapter),俗稱就是網卡,在遠古時代只有實體的,直到近年來才有了網路虛擬化的技術,所以才會出現虛擬網路介面卡和交換器,通常現在的網卡採用的網路通訊標準都是乙太網路(Ethernet),此外還有無線技術,也就是無線網路介面卡,而無線網卡採用的標準通常是802.11,有興趣可以再自己上Wiki或是Google看看相關RFC資料。

 

  • 網路交換器(Network switch),也稱為Switch,這個設備會有很多埠(連接口)讓你連接不同的電腦,在連線過程中,它會建立對應表,將每台電腦的唯一MAC位址對應到該電腦所連接的埠,當封包指定傳送到某一電腦時,這份封包並不會傳送至所有連接到這台Switch的電腦上(即所謂的廣播),而是單獨傳送到指定的電腦上。

參考R-3或Wiki

 

在了解了網路設備後,我們可以使用Windows Powershell來看看目前這台電腦上有哪些實體跟虛擬網路介面卡

透過 get-netadapter 可以在Shell上列出所有的網路介面卡

Powershell – 網路介面卡清單

 

透過 get-vmnetworkadapter –all 則會列出所有的虛擬網路介面卡

Powershell – 虛擬網路介面卡清單

 

實際上這台電腦擁有的實體網路介面卡只有Ethernet、AC-Wi-Fi和Xiaomi-Wi-Fi而已,另外其他的都是Emulator自動設定的,包含虛擬網路介面卡及交換器。

所以這台電腦上其實只有Emulator透過Hyper-V建立的虛擬網路設備,並沒有其他額外的虛擬設備,所以要除掉它們很簡單,直接使用Hyper-V管理員即可做刪除。

Hyper-V管理員 – Hyper-V伺服器(主機)列表

 

左方會顯示虛擬機的伺服器,而點選任一伺服器後會顯示建立於它之下的虛擬機,可以看到這邊已經建了一台Android 6.0的模擬機,再來,在這台虛擬機器上按右鍵選設定後,可以看見下方的視窗。

Hyper-V管理員 – 虛擬機設定

 

當中可以看見這台虛擬機上有兩張虛擬網卡

點選它後,可以在右下方看見移除的按鈕,點選後該張介面卡會出現刪除線,兩張都按下移除且確定沒錯後,就可以按下套用

  • 管理員 – 虛擬機設備設定

 

到這邊我們已經將這台虛擬機上的虛擬網卡刪除了,接下來要刪除虛擬交換器,而虛擬交換器是依據伺服器來做設定的,而非個別的虛擬機,所以我們對著伺服器按右鍵可以發現虛擬交換器管理員

Hype-V – 虛擬交換器設定

 

同樣的,這邊也是個別按下移除後,再按下套用即可刪除。

 

到這邊我們再透過PowerShell來確認是不是都已經清乾淨了

Powershell – 確認網路設備

 

可以看見所有的虛擬網路設備都被清除掉了,接著開啟Emulator來重新跑一次模擬器的Set up就可以了,過程中應該會顯示Emulator在幫你安裝一些東西,其實就是在設定虛擬網卡等等。

Emulator – Set up過程

Emulator – 啟動成功畫面

p.s. 如果電腦內的虛擬網路設備不單單只有Hyper-V虛擬機的(例如SothEther VPN),那麼你可以參考R-9其中有教如何透過PowerShell直接進行刪除(但有可能造成原本的VPN設定失效等等~)


好的,接下來其實才是我想記錄的主題,也就是到底Emulator是怎麼讓這些模擬器,也就是虛擬機連上網路的呢?

其實答案很簡單,在每一台虛擬機上會有所謂的網路介面卡,上面規範了網路通訊的協定,因此透過協定得以與其他持有相同協定的電腦做溝通,但別忘了這些都只是虛擬的,也就是說實質上它只是軟體,並沒有辦法真的連上所謂的Internet,可是換作是處於同一區域網路的電腦,是有辦法進行溝通的(我們會有一台能夠模擬虛擬機的主機(稱Host),而既然這些虛擬機都是建立在Host上,自然而然不需要透過其他硬體設別來連上這台Host上模擬的其他虛擬機,實際上就只是Host在內部做資料交換)。

參考R-4、R-5、R-6 (R-6介紹的很詳細)

那麼要怎麼做到讓這些虛擬機真的連上Internet呢? 這時候就可以透過虛擬交換器及實體網路介面卡間的互相合作來連上,而Hyper-V其實提供了三種不同類型的虛擬交換器,分別為External、Internal和Private。

 

  • External Virtual Switch

正如名稱所述,External Virtual Switch是為了讓VM能夠連接到外部的網路,而並非只有VM與Host之間的網路,為了要能夠做到連接外部網路,它自然會需要一個實體的介面卡來幫助它,所以當你在建立一個External Virtual Switch時就必須指定一個實體網路介面卡(若有多個介面卡,則會有下拉選單)。

External Virtual Switch – 選擇實體網路介面卡

 

而這當中比較不清楚的一點是下方的Checkbox寫著"允許管理作業系統共用此網路介面卡",經過多方查證後,它實際上的動作就是多設一張虛擬網路介面卡並加入到這個虛擬機群組的網路中,而作用則是讓你的Host能夠透過那張指定的實體網路介面卡來做溝通;如果不勾選則代表這張實體網路介面卡是這台交換器專用的,架構圖會像下方這張圖一樣。

      External Virtual Switch – 架構圖(勾選Checkbox)_擷取自R-6

 

根據上面所說的,其實我自己還是不太了解這背後真正的意義,假設我勾選了這項Checkbox是代表說主機還是能透過這張實體網路卡與外部網路做溝通,那麼如果我取消這項Checkbox,讓這張實體網路介面卡變成交換器專用的,是不是就代表說主機已經沒辦法再透過這張實體網介面卡連上網路了呢?

 

經過測試後發現確實沒錯,當你取消勾選這個Checkbox時,你所指定的實體網路介面卡就無法再為主機提供網路,而變成交換機專用(換句話說,這張網卡變成所有被分配到這台虛擬交換器上的虛擬機所專用)

 

  • Private Virtual Switch

當你想要建立一個獨立的網路在VM間時,那麼Private Virtual Switch正是你的首選,它不僅僅是與外部網路分離,同時也與Host是分離的,因此當你在創建Private Virtual Switch時,你並不需要額外選擇實體網路介面卡。

Private Virtual Switch – 建立Private Virtual Switch

 

而它的架構圖則會如下方。

Private Virtual Switch – 架構圖_擷取自R-6

 

  • Internal Virtual Switch

其實交換器通常只有上述兩種,但在Hyper-V中它提供了第三種,它同樣提供了一個獨立網路,與外部網路分離,但不同的是,它與主機是能夠互相溝通的,實際上來說其實就是Host也建立了一張虛擬網路卡,且分配在這個Internal Switch下,架構圖正如下方所示。

Internal Virtual Switch – 架構圖_擷取自R-6

 

l   後記

當初為了解決這個問題,來來回回看了很多文章,甚至補足自己對於網路架構整個的概念,回過頭來整理真的是累到不行,不過這樣也是為了自己不會因為時間久又要重新看過一次文章XD

最後把我參考的一些文章整理在下方,這些網站當中非常推薦大家去讀R-6,雖然是英文的,不過寫得很詳細,也解釋了很多比較基礎的概念,看完很有收穫;如果這個解法對你無效,可以去看看R-1,裡面有提及其他的解決方法。

 

  • Emulator問題相關

R-1  UDP問題-Stack Overflow

R-2 搞懂Hyper-V網路設定

 

  • 網路設備簡易介紹

R-3 HUB, Switch…差別

 

  • 虛擬交換器相關介紹

R-4 虛擬交換機-Wiki

R-5 虛擬交換機-iT Home

R-6 徹底了解Hyper-v的虛擬交換器

 

  • Hyper-V 建立與刪除虛擬交換器

R-7 建立虛擬交換器-中文

R-8 建立虛擬交換器-原文

R-9 如何刪除網路設備