-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhelpers.cpp
More file actions
129 lines (115 loc) · 3.38 KB
/
helpers.cpp
File metadata and controls
129 lines (115 loc) · 3.38 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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include<iostream>
#include "helpers.h"
using namespace std;
string stringUpper(char * lString) {
string uString = string(lString);
transform(uString.begin(), uString.end(), uString.begin(), ::toupper);
return uString;
}
//Helper
unsigned short in_cksum(unsigned short *addr, int len)
{
int nleft = len;
int sum = 0;
unsigned short *w = addr;
unsigned short answer = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(unsigned char *) (&answer) = *(unsigned char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}
//helper
unsigned short in_cksum_tcp(int src, int dst, unsigned short *addr, int len) {
struct psd_tcp buf;
u_short ans;
memset(&buf, 0, sizeof(buf));
buf.src.s_addr = src;
buf.dst.s_addr = dst;
buf.pad = 0;
buf.proto = IPPROTO_TCP;
buf.tcp_len = htons(len);
memcpy(&(buf.tcp), addr, len);
ans = in_cksum((unsigned short *) &buf, 12 + len);
return (ans);
}
//helper
unsigned short csum(unsigned short *buf, int nwords) {
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return (unsigned short) (~sum);
}
//helper
struct in_addr getMyAddress() {
struct ifaddrs *ifap, *ifa;
struct sockaddr_in *sa;
char addr[NI_MAXHOST];
int i = getifaddrs(&ifap);
getifaddrs(&ifap);
struct sockaddr_in dummy, myAddr;
socklen_t addr_len = sizeof(myAddr);
//nameserver for Google
dummy.sin_addr.s_addr = inet_addr("74.125.225.209");
dummy.sin_family = AF_INET;
dummy.sin_port = htons(80);
int descr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (descr < 0) {
cout << "Failed socket create to get IP" << endl;
exit(EXIT_FAILURE);
}
if (connect(descr, (struct sockaddr *) &dummy, sizeof(dummy)) != 0) {
cout << "Could not connect." << endl;
exit(EXIT_FAILURE);
}
if (getsockname(descr, (struct sockaddr *) &myAddr, &addr_len) != 0) {
cout << "\nCould not get the IP address!\n" << endl;
exit(EXIT_FAILURE);
}
inet_ntop(AF_INET, &(myAddr.sin_addr.s_addr), addr, INET_ADDRSTRLEN);
string test = string(addr);
cout << test << endl;
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
if (((struct sockaddr_in*) ifa->ifa_addr)->sin_addr.s_addr
== myAddr.sin_addr.s_addr) {
return myAddr.sin_addr;
}
}
}
//helper
bool isAlive(string ipToScan){
struct sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(80);
sa.sin_addr.s_addr = inet_addr(ipToScan.c_str());
socklen_t sLen = sizeof(sa);
char host[1024];
const sockaddr* sAddr = (sockaddr*)&sa;
if(getnameinfo(sAddr, sizeof(sa), host, sizeof(host), NULL, 0, NI_NAMEREQD)){
return false;
} else {
return true;
}
}
unsigned short in_cksum_udp(int src, int dst, unsigned short *addr, int len) {
struct psd_udp buf;
u_short ans;
memset(&buf, 0, sizeof(buf));
buf.src.s_addr = src;
buf.dst.s_addr = dst;
buf.pad = 0;
buf.proto = IPPROTO_UDP;
buf.udp_len = htons(len);
memcpy(&(buf.udp), addr, len);
ans = in_cksum((unsigned short *) &buf, 12 + len);
return (ans);
}