none
請問 Socket.ReceiveMessageFrom 的問題 RRS feed

  • 問題

  • 各位大大好, 

    以下是我測試的 Code,

               socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, true);
    
                socket.Bind(local_ep);
    
    
    
                SocketAsyncEventArgs eee = new SocketAsyncEventArgs();
                eee.Completed += new EventHandler<SocketAsyncEventArgs>(e_recv_Completed);
                eee.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
                eee.SocketFlags = SocketFlags.None;
                eee.SetBuffer(new byte[10000], 0, 1000);
                eee.UserToken = socket;
                return socket.ReceiveMessageFromAsync(eee);


    其中, socket 是一個 bind 好的 udp socket, (local_ep 的 ip 是 IPAddress.Any)

    我想用 ReceiveMessageFromAsync 來檢查我收到的data 是從哪一張網卡進來的,

    用同步的 ReceiveMessageFrom 及 BeginReceiveMessageFrom 都 ok,

    但用 ReceiveMessageFromAsync 時,

    callback 裡頭檢查 SocketAsyncEventArgs 的 ReceiveMessageFromPacketInfo,

    Address 是 null, Interface 是 0,

    SocketAsyncEventArgs 的 LastOperation 是 ReceiveFrom 而不是 ReceiveMessageFrom,

    測試的平台是 win7 32bit, .netframework 2.0 , 3.5 都試過

    請問是否有問有遇過相同的問題? 還是我哪裡少做了什麼?

    謝謝


    2012年4月24日 下午 02:28

解答

所有回覆

  • 這篇中,用 IP 識別?

    http://social.msdn.microsoft.com/forums/zh-TW/230/thread/83a6d495-35b8-4fc8-ad03-327d86702cc7/


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 LonghairPan 2012年5月2日 下午 01:54
    2012年4月24日 下午 03:31
  • 您好,

    請問一下,在e_recv_Completed Method中取得參數的AcceptSocket屬性中的RemoteEndPoint屬性是不是就是您要的呢?

    請參考:How To Use the SocketAsyncEventArgs Class


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 LonghairPan 2012年5月2日 下午 01:54
    2012年4月24日 下午 03:54
  • 以下引述自MSDN 文件庫 [Socket.ReceiveMessageFromAsync 方法 ]

    當第一次為給定的 Socket 指定 ReceiveMessageFromAsync 方法時,此方法會自動將 PacketInformation 通訊協定選項設定為 true 不過,IPPacketInformation 物件只會對在已設定通訊端選項後才到達本機電腦的封包有效。 如果通訊端在它繫結至本機端點時 (由 Bind 方法明確繫結,或由 ConnectConnectAsyncSendToSendToAsync 方法的其中一個隱含繫結),與第一次呼叫 ReceiveMessageFromAsync 方法之間傳送封包,則呼叫 ReceiveMessageFromAsync 方法將會為這些封包產生無效的 IPPacketInformation 物件。

    若要確定所有 IPPacketInformation 物件都有效,在被使用 SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean) 方法繫結至本機端點之前,應用程式應該將 PacketInformation 通訊端選項設定為 true


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 LonghairPan 2012年5月2日 下午 01:54
    2012年4月24日 下午 04:50
    版主
  • 謝謝各位大大的回覆,

    首先, 我是想取得我的 udp socket 收到的資料, 是從哪一張網卡進來的,

    如果是看 RemoteEndPoint, 那用 ReceiveFromAsync 就可以了,

    弄個 raw socket 再去看 header 似乎太過麻煩,

    原本是把所有的網卡裡頭的 ip 全列出來, 各開一個 socket 去 bind, 不是用 IPAddress.Any 的方式,

    現在是想重寫成用一個 socket 處理就好,

    我貼的那段 code, 在 Bind 之前, 有呼叫

    socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, true);

    這不知道是否就是 MSDN 提到要先處理的部份?

    這段 code 改用 ReceiveMessageFrom 及 BeginReceiveMessageFrom,

    都可以得到正確的 IPPacketInformation 的資訊,

    唯獨 ReceiveMessageFromAsync 得到的是空值,

    更納悶的是, SocketAsyncEventArgs 中的 LastOperation,

    竟然是 ReceiveFrom 而不是 ReceiveMessageFrom,

    是否有大大願意提供一個 sample 給我一個正確的方向? 謝謝....

    2012年4月25日 上午 02:14