2011-08-07 15 views
0

私は、ブロードキャストでマジックパケットを送信する機能を実装しました。 それは正常に動作しますが、私は特別なサーバーですべてのUDPブロードキャスト要求を受信したいと思います。 同様に動作します。 しかし、私がバイトを読んで、16進数(MACアドレス)にバイトを変換しようとすると、MACアドレスが間違っています。C#受信UPDブロードキャストバイト(マジックWOLパケット)宛先のMacを取得

にUDP要求を送信する:= "001a4d5f84f8"

特別なサーバが成功し16倍のMACアドレスを受け取り、それが変更されたMACと255.255.255.255: から: 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は、文字列に変換するバイトのシーケンスです。

(あなたがネット4上にないなら、あなたはSelect().ToArray()を追加する必要があります。)

+0

はそれが私が探しているまさにだ、svickありがとう。 Macの結果は正しいです。 ありがとうございます。 –

関連する問題