C # Получение байтов UPD Broadcast (пакет WOL Magic) Получить Mac назначения - PullRequest
0 голосов
/ 07 августа 2011

Я реализовал функцию отправки магических пакетов через широковещательную рассылку.Работает нормально, но я бы хотел получать все широковещательные запросы UDP на специальном сервере.Работает так же.Но если я попытаюсь прочитать байты и преобразовать байты в шестнадцатеричный (MAC-адрес) обратно, MAC-адрес будет неправильным.

Отправить UDP-запрос на: 255.255.255.255 с MAC = "001a4d5f84f8"

Специальный сервер успешно получил MAC-адрес 16 раз, но он изменился: с: 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();
}

1 Ответ

0 голосов
/ 07 августа 2011

Ваша проблема Encoding.ASCII.GetString(). Он может читать строки, закодированные с использованием ASCII, но это не то, что вы отправляете. Вы должны декодировать байты как байты.

Если вы хотите получить результат в виде строки, вы можете использовать что-то вроде

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

Здесь bytes - это последовательность байтов, которые вы хотите преобразовать в строку.

(Если вы не используете .Net 4, вам нужно добавить .ToArray() после Select().)

...