-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPacketSender.cpp
More file actions
82 lines (68 loc) · 2.33 KB
/
PacketSender.cpp
File metadata and controls
82 lines (68 loc) · 2.33 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
// Created by richa on 2/24/2024.
//
#include <winsock2.h>
#include <ws2tcpip.h>
#include <unistd.h>
#include "PacketSender.h"
#include <iostream>
#include <sstream>
#pragma comment(lib, "ws2_32.lib")
PacketSender::PacketSender() = default;
PacketSender::~PacketSender() = default;
bool PacketSender::sendMagicPacket(const std::string &macAddress) {
// Initialize Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
std::cerr << "Error initializing Winsock" << std::endl;
return false;
}
// Create UDP socket
SOCKET udpsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (udpsocket == INVALID_SOCKET) {
WSACleanup();
std::cerr << "Error creating socket" << std::endl;
return false;
}
// Enable broadcast option on the socket
BOOL broadcast = TRUE;
if (setsockopt(udpsocket, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char*>(&broadcast),
sizeof(broadcast)) == SOCKET_ERROR) {
closesocket(udpsocket);
WSACleanup();
std::cerr << "Error setting socket option" << std::endl;
return false;
}
// Construct sockaddr_in structure for broadcast address
sockaddr_in destAddr;
destAddr.sin_family = AF_INET;
destAddr.sin_port = htons(9);
destAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
// Construct magic packet
std::ostringstream packetStream;
// Add 6 byte preamble
packetStream << std::string(6, '\xFF');
// Repeat MAC address 16 times
for (int i = 0; i < 16; i++) {
std::istringstream macStream(macAddress);
unsigned int macByte;
while (macStream >> std::hex >> macByte) {
packetStream << static_cast<unsigned char>(macByte);
if (macStream.peek() == ':') macStream.ignore();
}
}
std::string magicPacket = packetStream.str();
// Send magic packet
int bytesSent = sendto(udpsocket, magicPacket.c_str(), magicPacket.size(), 0,
reinterpret_cast<sockaddr*>(&destAddr), sizeof(destAddr));
if (bytesSent == SOCKET_ERROR) {
closesocket((udpsocket));
WSACleanup();
std::cerr << 'Error sending magic packet' << std::endl;
return false;
}
closesocket(udpsocket);
WSACleanup();
std::cout << "Packet sent!\n";
return true; // Packet sent successfully
}