Ja ehm... Je wilt eens verder kijken naar UDP. Als je een UDP netwerp pakket verstuurt met je socket opties op broadcast dan komt het in principe bij alle machines op hetzelfde netwerksegment (!) terecht. Als je wilt communiceren met een machine op een ander segment moet je een gericht pakket gaan sturen, of een broadcast host (erg ongebruikelijk) neerzetten op dat netwerk.
Hier onder als voorbeeldje een stukje code wat ik zelf gebruik om de WakeOnLAN functionaliteit van mijn linux machine te activeren. (Hoef ik niet naar boven te lopen als ik wil internetten

) Misschien hebben er nog meer tweakerts wat aan ook!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| // WOLSend.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winsock2.h"
#include <iostream.h>
#define DEFAULT_PORT 5001
#define DEFAULT_PROTO SOCK_DGRAM // TCP
int main(int argc, char* argv[])
{
struct sockaddr_in local;
WSADATA wsaData;
if (WSAStartup(0x202,&wsaData) != SOCKET_ERROR)
{
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
char val = TRUE;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)) != 0)
cout <<"Error: setsockopt!" <<endl;
unsigned char buffer[200];
int i = 0, j;
for (j = 0; j < 6; j++) { buffer[i] = 0xFF; i++; }
// // address 00-D0-B7-8F-5D-54 // intel management adapter #1
// // address 00-50-FC-27-C9-FD // rtl8139 with WOL capability
for (j = 0; j < 16; j++) // 8 is not enough...
{
// buffer[i] = 0x00; i++;
// buffer[i] = 0xD0; i++;
// buffer[i] = 0xB7; i++;
// buffer[i] = 0x8F; i++;
// buffer[i] = 0x5D; i++;
// buffer[i] = 0x53; i++;
buffer[i] = 0x00; i++;
buffer[i] = 0x50; i++;
buffer[i] = 0xFC; i++;
buffer[i] = 0x27; i++;
buffer[i] = 0xC9; i++;
buffer[i] = 0xFD; i++;
}
local.sin_family = AF_INET;
local.sin_addr.s_addr = htonl(INADDR_BROADCAST);
local.sin_port = htons(4242);
for (j = 0; j < 6; j++)
if (sendto(sock, (char *)buffer, 200, 0, (struct sockaddr *)&local, sizeof(local)) == 0)
cout <<"Error: sendto!" <<endl;
WSACleanup();
}
return 0;
} |
Hoop dat je er wat aan hebt. Dit programma werkt door een UDP broadcast te doen met als payload in het pakket een geldig WakeOnLAN frame...