2011-08-07 25 views
0

我已經實現了通過廣播發送魔術數據包的功能。 它工作正常,但我想在特殊服務器上接收所有UDP廣播請求。 也適用。 但是,如果我嘗試讀取字節並將字節轉換爲十六進制(MAC地址),則該mac地址將會出錯。C#接收UPD廣播字節(Magic WOL數據包)獲取目標Mac

發送UDP請求:255.255.255.255與MAC = 「001a4d5f84f8」

特殊服務器接收全成16倍的MAC地址,但它已經改變了: 來源: 001a4d5f84f8 要: 001a4d5f3f3f

任何想法?

我的功能:

//Send Packets 
//------------------------------------------------------ 
string MAC_ADDRESS = "001a4d5f84f8"; 

UdpClient UDP = new UdpClient(); 
try 
{ 
    IPAddress IPBCast = IPAddress.Parse("255.255.255.255"); 
    UDP.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); 
    int offset = 0; 
    byte[] buffer = new byte[512]; 
    //first 6 bytes should be 0xFF 
    for (int y = 0; y < 6; y++) 
     buffer[offset++] = 0xFF; 
    //now repeate MAC 16 times 
    for (int y = 0; y < 16; y++) 
    { 
     int i = 0; 
     for (int z = 0; z < 6; z++) 
     { 
      buffer[offset++] = 
      byte.Parse(MAC_ADDRESS.Substring(i, 2), NumberStyles.HexNumber); 
      i += 2; 
     } 
    } 
    UDP.EnableBroadcast = true; 
    UDP.Send(buffer, 512, new IPEndPoint(IPBCast, 0x1)); 
} 
catch (Exception ex1) 
{ 
    MessageBox.Show(ex1.Message); 
    UDP.Close(); 
} 
//Receive Packets 
//------------------------------------------------------ 
Socket sock = new Socket(AddressFamily.InterNetwork, 
      SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0x1); 
sock.Bind(iep); 

EndPoint ep = (EndPoint)iep; 
Console.WriteLine("Ready to receive..."); 

byte[] data = new byte[1024]; 
int recv = sock.ReceiveFrom(data, ref ep); 

string stringData = Encoding.ASCII.GetString(data, 0, recv); 

Console.WriteLine("received: {0} from: {1}", (StringToHex(stringData)), ep.ToString()); 
//Convert Received String To Hex 
//------------------------------------------------------ 
public static string StringToHex(string hexstring) 
{ 
    var sb = new StringBuilder(); 
    foreach (char t in hexstring) 
     sb.Append(Convert.ToInt32(t).ToString("x") + " "); 
    return sb.ToString(); 
} 

回答

0

你的問題是Encoding.ASCII.GetString()。它可以讀取使用ASCII編碼的字符串,但這不是你發送的內容。您必須將字節解碼爲字節。

如果你想要的結果作爲字符串,可以使用類似

string.Join("", bytes.Select(b => b.ToString("x2"))) 

這裏,bytes是要轉換爲字符串的字節序列。

(如果你不是在.NET 4中,你需要的Select()後添加.ToArray()

+0

謝謝svick,這正是我要找的。 mac結果是正確的。 非常感謝。 –