none
UdpClient 傳送與接收廣播訊息 RRS feed

  • 問題

  • 我目前有兩個程式,Client、Server。程式的用途大概是Server對Client下命令,來達到遠端遙控的功能。而這兩台電腦都是在同一個網域,網路芳鄰->檢視工作群組電腦、命令列->Ping IPAddres or ComputerName 都可以抓到對方。

    我使用UdpClient來做到接收跟傳送的功能。

    程式大概的流程是,Client程式會在各個電腦上常註啟動,而管理員需要進行遙控的時候,則會開啟Server程式,Server會發布廣播訊息,要求已經啟動的Client告知Server它已經啟動。這個流程在多數的電腦的配對都可以達成,但是在某些配對上卻沒有辦法。由於我們有使用還原精靈,因此每部電腦的設定都是一樣的。

    上述中,無法完成流程的電腦配對,我做過以下測試:

    1. 網路芳鄰->檢視工作群組電腦、命令列->Ping IPAddres or ComputerName 都可以抓到對方。
    2. UdpClient 改成針對這幾部電腦的IP或名稱發布單點訊息,但是無法收到。
    3. 原本可以的電腦配對,如果發布單點訊息仍然有效。
    我測試了很久仍然不太了解問題的根源,由於我對Socket的運作模式不是太熟悉,實在缺乏分析的能力,請各位高手幫忙想想辦法。

    2010年4月18日 下午 06:21

所有回覆

  • Server開啟的埠號是 new UdpClient(10300);

    Server 在 UdpClient.Send方法使用的是 new IPEndPoint(IPAddress.Broadcast, 10400);

    Client開啟的埠號是  new UdpClient(10400);

    Client 在 UdpClinet.Receive方法使用的是 new IPEndPoint(IPAddress.Any, 10300);

    2010年4月18日 下午 06:23
  • Client開啟的埠號是  new UdpClient(10400);

    Client 在 UdpClinet.Receive方法使用的是 new IPEndPoint(IPAddress.Any, 10300);

    你Server send to Client : 10040, 那你Client UdpClient.Receive應該是 10040

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月19日 上午 02:31
    版主
  • Client開啟的埠號是  new UdpClient(10400);

    Client 在 UdpClinet.Receive方法使用的是 new IPEndPoint(IPAddress.Any, 10300);

    你Server send to Client : 10040, 那你Client UdpClient.Receive應該是 10040

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
      UdpClient.Receive所傳入的IPEndPoint的值,他的代表意義不是指定接收目標主機上的特定端點來的訊號嗎?因為這樣寫在其他配對都能實現,所以我不確定是不是因為這樣,我稍後測試這個看看,感謝Bill大的建議。
    2010年4月19日 上午 07:46
  • 看起來是我誤解了. 現在這樣講好了. 你有一個Udp的BroadCast端, 還有一堆Udp的Receive端.

    通常Udp的Receive端我會這樣寫:

    1. 假設為我們不知道 Broadcast端會從哪個IP與Port傳過來, 所以會先建立一個代表未知的 IPEndPoint類別執行個體

    ex:  IPEndPoint RemoteIpEndPoint = New IPEndPoint(IPAddress.Any, 0)

    2. Receive的部份則是 myUDPClient.Receive(RemoteIpEndPoint)

    PS: 的確我上面是弄錯你的意思. 你那樣寫應該是對的, 只不過通常我不會在receive端先指定一定要從哪個IP, Port收資料.

    如果還是怪怪的, 建議你把關鍵點的Code貼上來.

    你可以看一下以下這篇文章, 所謂的Udp的Receive端就是那篇文章的Server端程式

    http://www.dotblogs.com.tw/billchung/archive/2009/06/10/8755.aspx


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月19日 上午 11:24
    版主
  • 我剛在散步的過程想到我犯了一個錯誤, 就是UDP本來就不保證一定收到的, 因為它是一種不會有ACK的協定.
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月19日 下午 01:43
    版主
  • 感謝Bill大的回文,那請問有什麼通訊協定是較可靠的呢?以目前我的功力來說,直接控制Socket實在有點困難,不知道.Net有沒有寫好的Class可供使用?
    2010年4月19日 下午 02:52
  • 通常我們用的不外乎 TCP or UDP (以第四層來說), TCP是有ACK, 而UDP是沒有ACK的.

    如果你要確保一定接收, 那得用TCP, 可是TCP是沒法做廣播的.

    在.Net 實作TCP, 比較簡單的方法就是直接使用TcpClient和TcpLisenter類別來做

     


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月19日 下午 03:06
    版主
  • 但是我卻一定需要用到廣播...因為沒有固定伺服器,假設從較低層來作,有其他的方法嗎?請問Socket是最底層嗎?
    2010年4月19日 下午 03:27
  • 您好:
    不好意思想請教一下,如果我有兩張網路卡
    那我要怎知道我的UdpClient是透過哪張網路卡出去呢?
    因為我現在利用C# 設定的UdpClient好像他都會自動的選擇一張正在上網的
    網路卡出去
    2010年4月20日 下午 05:29
  • 但是我卻一定需要用到廣播...因為沒有固定伺服器,假設從較低層來作,有其他的方法嗎?請問Socket是最底層嗎?


    最底層如果以OSI 7 層定義來看, 硬體規格才是最底層, 如果以軟體的概念來看, 大概可以控制到第二層. 不過如果以Socket 實作IP協定就已經是第三層了.

    所以, 只有Udp, 可能的解法是多廣播幾次來比對.


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月2日 上午 08:53
    版主