Function discovery

:smiley: Hello everybody

Sorry for my englsih

I would like to make the discovery function of winbox in C#

I found a similar program c ++ and I would want your to pass of c ++ in c #

this is the program in c+



Mikrotik Neighbor Discovery (MNDP)

Mikrotik Neighbor Discovery (MNDP) (C++/Qt)

For all that are interestet in discovering Mikrotik devices in their own programs here is an example how to do, written in C++/Qt

First we send out some UDP packages to request Mikrotik answers:

QByteArray datagram;
datagram.resize(4);
datagram[0] = 0 x 00;
datagram[1] = 0 x 00;
datagram[2] = 0 x 00;
datagram[3] = 0 x 00;

// Send a few packets to force Mikrotik Discovery
for(int i = 0; i < 3; i++)
··udpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 5678);

After a while we get a UDP Packet back with the required information, we just need to parse it:

QByteArray datagram;
QHostAddress *address = new QHostAddress;
int datatoread = udpSocket->pendingDatagramSize();
char *datagramPtr = 0;
short len = 0;

QByteArray macAddr, identity, version, platform, uptime, softwareid, board, unpack, interface;

datagram.resize(datatoread);
udpSocket->readDatagram(datagram.data(), datatoread, address);

// MNDP packet has a bit size
if(datatoread < 18)
·· continue;

// Work with pointer
datagramPtr = datagram.data();

// Get MAC-address
len = 0;
len |= ((datagramPtr[6])& 0 x FF < < 8) | ((datagramPtr[7]) & 0 x FF);
macAddr.resize(len*2+5);
sprintf(macAddr.data(), “% 02x:% 02x:% 02x:% 02x:% 02x:% 02x”,
datagramPtr[8], datagramPtr[9], datagramPtr[10],
datagramPtr[11], datagramPtr[12], datagramPtr[13]);

// Get Identity
datagramPtr += 16;
len = 0;
len |= ((datagramPtr[0]) & 0 x FF << 8) | ((datagramPtr[1])& 0 x FF);
identity.resize(len);
strncpy(identity.data(), datagramPtr+2, len);

// Get Version
datagramPtr += len + 4;
len = 0;
len |= ((datagramPtr[0])& 0 x FF << 8) | ((datagramPtr[1])& 0 x FF);
version.resize(len);
strncpy(version.data(), datagramPtr+2, len);

// Get Platform
datagramPtr += len + 4;
len = 0;
len |= ((datagramPtr[0])&0xFF << 8) | ((datagramPtr[1]) & 0 x FF);
platform.resize(len);
strncpy(platform.data(), datagramPtr+2, len);

// Get Uptime
datagramPtr += len + 4;
len = 0;
len |= ((datagramPtr[0]) & 0 x FF << 8) | ((datagramPtr[1]) & 0 x FF);
uptime.resize(len);
strncpy(uptime.data(), datagramPtr+2, len);

// Get Software-ID
datagramPtr += len + 4;
len = 0;
len |= ((datagramPtr[0])&0xFF << 8) | ((datagramPtr[1])&0xFF);
softwareid.resize(len);
strncpy(softwareid.data(), datagramPtr+2, len);

// Get Board
datagramPtr += len + 4;
len = 0;
len |= ((datagramPtr[0])&0xFF << 8) | ((datagramPtr[1])&0xFF);
board.resize(len);
strncpy(board.data(), datagramPtr+2, len);

// Get Unpack
datagramPtr += len + 4;
len = 0;
len |= ((datagramPtr[0])&0xFF < < 8) | ((datagramPtr[1])&0xFF);
unpack.resize(len);
strncpy(unpack.data(), datagramPtr+2, len);

// Get Interface
datagramPtr += len + 4;
len = 0;
len |= ((datagramPtr[0])&0xFF < < 8) | ((datagramPtr[1])&0xFF);
interface.resize(len);
strncpy(interface.data(), datagramPtr+2, len);

UdpClient udpClient = new UdpClient();

byte datagram = new byte[4];
datagram[0] = 0;
datagram[1] = 0;
datagram[2] = 0;
datagram[3] = 0;

IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0);

udpClient.EnableBroadcast = true;

for (int i = 0; i < 3; i++)
{
udpClient.Send(datagram, datagram.Length, new IPEndPoint(IPAddress.Broadcast, 5678));
}

udpClient.Close();

Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 5678);
sock.Bind(iep);
EndPoint ep = (EndPoint)iep;
Console.WriteLine(“Ready to receive…”);

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

Console.WriteLine(“{0}:{1}:{2}:{3}:{4}:{5}”,
receiveBytes[8].ToString(“X2”),
receiveBytes[9].ToString(“X2”),
receiveBytes[10].ToString(“X2”),
receiveBytes[11].ToString(“X2”),
receiveBytes[12].ToString(“X2”),
receiveBytes[13].ToString(“X2”));

var pointer = 17;
var len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

pointer += len + 4;
len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

pointer += len + 4;
len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

pointer += len + 4;
len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

pointer += len + 4;
len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

pointer += len + 4;
len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

pointer += len + 4;
len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

pointer += len + 4;
len = receiveBytes[pointer];

Console.WriteLine(Encoding.ASCII.GetString(receiveBytes, pointer + 1, len));

Console.WriteLine(“received: {0} from: {1}”,
stringData, ep.ToString());

For C# discovery function see MndpTray https://github.com/xmegz/MndpTray