1 #define _CRT_SECURE_NO_WARNINGS
18 #include <arpa/inet.h>
19 #include <arpa/inet.h>
23 #include <netinet/in.h>
24 #include <netinet/in.h>
25 #include <netinet/tcp.h>
28 #include <sys/ioctl.h>
29 #include <sys/socket.h>
30 #include <sys/socket.h>
32 #include <sys/types.h>
35 #define SOCKET_ERROR (-1)
37 #define TIMEVAL timeval
38 #define closesocket close
39 #define ioctlsocket ioctl
40 #define SOCKADDR sockaddr
41 #define SD_SEND SHUT_WR
61 bool CNetwork::InitWinsock() {
63 WORD wVersionRequested = MAKEWORD(2, 2);
67 if (WSAStartup(wVersionRequested, &wsaData) != 0) {
71 if (wsaData.wVersion != wVersionRequested) {
85 mSocket = socket(AF_INET, SOCK_STREAM, 0);
87 strcpy(mErrorStr,
"Socket could not be created.");
93 if (inet_pton(AF_INET, serverAddr, &(sAddr.sin_addr)) == 0) {
96 struct addrinfo hints, *servinfo;
98 memset(&hints, 0,
sizeof hints);
99 hints.ai_family = AF_INET;
100 hints.ai_socktype = SOCK_STREAM;
102 if (getaddrinfo(serverAddr,
nullptr, &hints, &servinfo) != 0) {
103 strcpy(mErrorStr,
"Error looking up host name.");
107 if (servinfo ==
nullptr) {
108 strcpy(mErrorStr,
"Error looking up host name.");
112 sAddr.sin_addr = ((sockaddr_in*)servinfo[0].ai_addr)->sin_addr;
114 sAddr.sin_port = htons(nPort);
115 sAddr.sin_family = AF_INET;
117 if (connect(mSocket, (sockaddr*)(&sAddr),
sizeof(sAddr)) ==
SOCKET_ERROR) {
118 strcpy(mErrorStr,
"Connect failed.");
131 if (setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY, &bNoDelay,
132 sizeof(bNoDelay)) != 0) {
156 if (nUDPPort == 0 || nUDPPort > 1023) {
160 sockaddr_in recvAddr;
161 recvAddr.sin_family = AF_INET;
162 recvAddr.sin_port = htons(nUDPPort);
163 recvAddr.sin_addr.s_addr = INADDR_ANY;
165 tempSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
169 if (
ioctlsocket(tempSocket, FIONBIO, &argp) == 0) {
170 if (bind(tempSocket, (
SOCKADDR*)&recvAddr,
sizeof(recvAddr)) != -1) {
178 if (setsockopt(tempSocket, SOL_SOCKET, SO_BROADCAST, &broadcast,
179 sizeof(broadcast)) == 0) {
180 mUDPBroadcastSocket = tempSocket;
184 "Failed to set socket options for UDP server socket.");
187 mUDPSocket = tempSocket;
191 strcpy(mErrorStr,
"Failed to bind UDP server socket.");
194 strcpy(mErrorStr,
"Failed to make UDP server socket unblocking.");
197 strcpy(mErrorStr,
"Failed to create UDP server socket.");
206 sockaddr_in recvAddr;
207 socklen_t addrLen =
sizeof(recvAddr);
208 if (getsockname(socket, (
struct sockaddr*)&recvAddr, &addrLen) == 0 &&
209 recvAddr.sin_family == AF_INET && addrLen ==
sizeof(recvAddr)) {
210 return ntohs(recvAddr.sin_port);
227 int timeout,
unsigned int* ipAddr) {
229 sockaddr_in source_addr;
230 socklen_t fromlen =
sizeof(source_addr);
232 fd_set readFDs, exceptFDs;
237 FD_SET(mSocket, &readFDs);
238 FD_SET(mSocket, &exceptFDs);
241 FD_SET(mUDPSocket, &readFDs);
242 FD_SET(mUDPSocket, &exceptFDs);
245 FD_SET(mUDPBroadcastSocket, &readFDs);
246 FD_SET(mUDPBroadcastSocket, &exceptFDs);
255 sTimeval.tv_sec = timeout / 1000000;
256 sTimeval.tv_usec = timeout % 1000000;
257 pTimeval = &sTimeval;
264 std::max(mSocket, std::max(mUDPSocket, mUDPBroadcastSocket)) + 1;
268 int selectRes = select(nfds, &readFDs,
nullptr, &exceptFDs, pTimeval);
269 if (selectRes == 0) {
273 if (FD_ISSET(mSocket, &exceptFDs)) {
275 FD_CLR(mSocket, &exceptFDs);
278 }
else if (FD_ISSET(mSocket, &readFDs)) {
279 recieved = recv(mSocket, rtDataBuff, header ? 8 : dataBufSize, 0);
280 FD_CLR(mSocket, &readFDs);
281 }
else if (FD_ISSET(mUDPSocket, &exceptFDs)) {
283 FD_CLR(mUDPSocket, &exceptFDs);
286 }
else if (FD_ISSET(mUDPSocket, &readFDs)) {
287 recieved = recvfrom(mUDPSocket, rtDataBuff, dataBufSize, 0,
288 (sockaddr*)&source_addr, &fromlen);
289 FD_CLR(mUDPSocket, &readFDs);
290 }
else if (FD_ISSET(mUDPBroadcastSocket, &exceptFDs)) {
292 FD_CLR(mUDPBroadcastSocket, &exceptFDs);
295 }
else if (FD_ISSET(mUDPBroadcastSocket, &readFDs)) {
296 recieved = recvfrom(mUDPBroadcastSocket, rtDataBuff, dataBufSize, 0,
297 (sockaddr*)&source_addr, &fromlen);
298 FD_CLR(mUDPBroadcastSocket, &readFDs);
300 *ipAddr = source_addr.sin_addr.s_addr;
307 if (recieved == -1) {
317 while (totalSent < size) {
318 sent = send(mSocket, sendBuf + totalSent, size - totalSent, 0);
329 unsigned int filterAddr ) {
330 bool broadCastSent =
false;
334 IP_ADAPTER_INFO* ifap =
nullptr;
335 IP_ADAPTER_INFO* ifa =
nullptr;
340 erradapt = ::GetAdaptersInfo(ifap, &ulLen);
341 if (erradapt == ERROR_BUFFER_OVERFLOW) {
342 ifap = (IP_ADAPTER_INFO*)malloc(ulLen);
343 erradapt = ::GetAdaptersInfo(ifap, &ulLen);
346 if (erradapt == ERROR_SUCCESS) {
347 sockaddr_in recvAddr;
348 recvAddr.sin_family = AF_INET;
349 recvAddr.sin_port = htons(port);
350 recvAddr.sin_addr.s_addr = 0xffffffff;
355 if (ifa->Type == MIB_IF_TYPE_ETHERNET) {
356 unsigned int nIPaddr;
357 unsigned int nIPmask;
359 if (inet_pton(AF_INET, ifa->IpAddressList.IpAddress.String,
361 inet_pton(AF_INET, ifa->IpAddressList.IpMask.String, &nIPmask) ==
365 recvAddr.sin_addr.s_addr = nIPaddr | (~nIPmask);
366 if (recvAddr.sin_addr.s_addr != (filterAddr | (~nIPmask))) {
367 if (sendto(mUDPBroadcastSocket, sendBuf, size, 0,
368 (sockaddr*)&recvAddr,
sizeof(recvAddr)) == size) {
369 broadCastSent =
true;
379 struct ifaddrs* ifap =
nullptr;
380 if (getifaddrs(&ifap) == 0) {
381 sockaddr_in recvAddr;
382 recvAddr.sin_family = AF_INET;
383 recvAddr.sin_port = htons(port);
384 recvAddr.sin_addr.s_addr = 0xffffffff;
389 if (ifa->ifa_addr->sa_family == AF_INET) {
390 auto* sa = (
struct sockaddr_in*)ifa->ifa_addr;
391 auto ipAddr = sa->sin_addr.s_addr;
393 auto* saMask = (
struct sockaddr_in*)ifa->ifa_netmask;
394 auto ipMask = saMask->sin_addr.s_addr;
396 recvAddr.sin_addr.s_addr = ipAddr | (~ipMask);
397 if (recvAddr.sin_addr.s_addr != (filterAddr | (~ipMask))) {
398 if (sendto(mUDPBroadcastSocket, sendBuf, size, 0,
399 (sockaddr*)&recvAddr,
sizeof(recvAddr)) == size) {
400 broadCastSent =
true;
411 return broadCastSent;
414 void CNetwork::SetErrorString() {
416 char* error =
nullptr;
417 mLastError = GetLastError();
418 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
419 nullptr, mLastError, 0,
reinterpret_cast<LPTSTR
>(&error), 0,
421 sprintf(mErrorStr,
"%s", error);
425 char* error = strerror(mLastError);
426 if (error !=
nullptr) {
427 sprintf(mErrorStr,
"%s", error);
438 IP_ADAPTER_INFO* pAdptInfo =
nullptr;
439 IP_ADAPTER_INFO* pNextAd =
nullptr;
444 erradapt = ::GetAdaptersInfo(pAdptInfo, &ulLen);
445 if (erradapt == ERROR_BUFFER_OVERFLOW) {
446 pAdptInfo = (IP_ADAPTER_INFO*)malloc(ulLen);
447 erradapt = ::GetAdaptersInfo(pAdptInfo, &ulLen);
450 if (erradapt == ERROR_SUCCESS) {
453 if (pNextAd->Type == MIB_IF_TYPE_ETHERNET) {
456 if (inet_pton(AF_INET, pNextAd->IpAddressList.IpAddress.String,
458 return addr == nAddr;
461 pNextAd = pNextAd->Next;
466 struct ifaddrs* pAdptInfo =
nullptr;
467 struct ifaddrs* pNextAd =
nullptr;
468 if (getifaddrs(&pAdptInfo) == 0) {
471 if (pNextAd->ifa_addr->sa_family == AF_INET) {
472 struct sockaddr_in* pNextAd_in = (
struct sockaddr_in*)pNextAd->ifa_addr;
473 if (pNextAd_in->sin_addr.s_addr == nAddr) {
477 pNextAd = pNextAd->ifa_next;
480 freeifaddrs(pAdptInfo);