1 #define _CRT_SECURE_NO_WARNINGS 17 #include <arpa/inet.h> 18 #include <netinet/in.h> 19 #include <sys/socket.h> 21 #include <sys/types.h> 22 #include <sys/socket.h> 24 #include <sys/ioctl.h> 27 #include <netinet/in.h> 28 #include <netinet/tcp.h> 30 #include <arpa/inet.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 65 bool CNetwork::InitWinsock()
68 WORD wVersionRequested = MAKEWORD(2,2);
72 if (WSAStartup(wVersionRequested, &wsaData) != 0)
77 if (wsaData.wVersion != wVersionRequested)
94 mSocket = socket(AF_INET, SOCK_STREAM, 0);
97 strcpy(mErrorStr,
"Socket could not be created.");
103 if (inet_pton(AF_INET, serverAddr, &(sAddr.sin_addr)) == 0)
107 struct addrinfo hints, *servinfo;
109 memset(&hints, 0,
sizeof hints);
110 hints.ai_family = AF_INET;
111 hints.ai_socktype = SOCK_STREAM;
113 if (getaddrinfo(serverAddr,
nullptr, &hints, &servinfo) != 0)
115 strcpy(mErrorStr,
"Error looking up host name.");
119 if (servinfo ==
nullptr)
121 strcpy(mErrorStr,
"Error looking up host name.");
125 sAddr.sin_addr = ((sockaddr_in *)servinfo[0].ai_addr)->sin_addr;
127 sAddr.sin_port = htons(nPort);
128 sAddr.sin_family = AF_INET;
131 if (connect(mSocket, (sockaddr*)(&sAddr),
sizeof(sAddr)) ==
SOCKET_ERROR)
133 strcpy(mErrorStr,
"Connect failed.");
146 if (setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY, &bNoDelay,
sizeof(bNoDelay)) != 0)
178 if (nUDPPort == 0 || nUDPPort > 1023)
183 sockaddr_in recvAddr;
184 recvAddr.sin_family = AF_INET;
185 recvAddr.sin_port = htons(nUDPPort);
186 recvAddr.sin_addr.s_addr = INADDR_ANY;
188 tempSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
195 if (bind(tempSocket, (
SOCKADDR *) &recvAddr,
sizeof(recvAddr)) != -1)
205 if (setsockopt(tempSocket, SOL_SOCKET, SO_BROADCAST, &broadcast,
sizeof(broadcast)) == 0)
207 mUDPBroadcastSocket = tempSocket;
212 strcpy(mErrorStr,
"Failed to set socket options for UDP server socket.");
217 mUDPSocket = tempSocket;
223 strcpy(mErrorStr,
"Failed to bind UDP server socket.");
228 strcpy(mErrorStr,
"Failed to make UDP server socket unblocking.");
233 strcpy(mErrorStr,
"Failed to create UDP server socket.");
243 sockaddr_in recvAddr;
244 socklen_t addrLen =
sizeof(recvAddr);
245 if (getsockname(socket, (
struct sockaddr *)&recvAddr, &addrLen) == 0 &&
246 recvAddr.sin_family == AF_INET &&
247 addrLen ==
sizeof(recvAddr))
249 return ntohs(recvAddr.sin_port);
266 int CNetwork::Receive(
char* rtDataBuff,
int dataBufSize,
bool header,
int timeout,
unsigned int *ipAddr)
269 sockaddr_in source_addr;
270 socklen_t fromlen =
sizeof(source_addr);
272 fd_set readFDs, exceptFDs;
278 FD_SET(mSocket, &readFDs);
279 FD_SET(mSocket, &exceptFDs);
283 FD_SET(mUDPSocket, &readFDs);
284 FD_SET(mUDPSocket, &exceptFDs);
288 FD_SET(mUDPBroadcastSocket, &readFDs);
289 FD_SET(mUDPBroadcastSocket, &exceptFDs);
301 sTimeval.tv_sec = timeout / 1000000;
302 sTimeval.tv_usec = timeout % 1000000;
303 pTimeval = &sTimeval;
309 const int nfds = std::max(mSocket, std::max(mUDPSocket, mUDPBroadcastSocket)) + 1;
313 int selectRes = select(nfds, &readFDs,
nullptr, &exceptFDs, pTimeval);
320 if (FD_ISSET(mSocket, &exceptFDs))
323 FD_CLR(mSocket, &exceptFDs);
327 else if (FD_ISSET(mSocket, &readFDs))
329 recieved = recv(mSocket, rtDataBuff, header ? 8 : dataBufSize, 0);
330 FD_CLR(mSocket, &readFDs);
332 else if (FD_ISSET(mUDPSocket, &exceptFDs))
335 FD_CLR(mUDPSocket, &exceptFDs);
339 else if (FD_ISSET(mUDPSocket, &readFDs))
341 recieved = recvfrom(mUDPSocket, rtDataBuff, dataBufSize, 0, (sockaddr*)&source_addr, &fromlen);
342 FD_CLR(mUDPSocket, &readFDs);
344 else if (FD_ISSET(mUDPBroadcastSocket, &exceptFDs))
347 FD_CLR(mUDPBroadcastSocket, &exceptFDs);
351 else if (FD_ISSET(mUDPBroadcastSocket, &readFDs))
353 recieved = recvfrom(mUDPBroadcastSocket, rtDataBuff, dataBufSize, 0, (sockaddr*)&source_addr, &fromlen);
354 FD_CLR(mUDPBroadcastSocket, &readFDs);
357 *ipAddr = source_addr.sin_addr.s_addr;
379 while (totalSent < size)
381 sent = send(mSocket, sendBuf + totalSent, size - totalSent, 0);
395 bool broadCastSent =
false;
400 IP_ADAPTER_INFO* ifap =
nullptr;
401 IP_ADAPTER_INFO* ifa =
nullptr;
406 erradapt = ::GetAdaptersInfo(ifap, &ulLen);
407 if (erradapt == ERROR_BUFFER_OVERFLOW)
409 ifap = (IP_ADAPTER_INFO*)malloc(ulLen);
410 erradapt = ::GetAdaptersInfo(ifap, &ulLen);
413 if (erradapt == ERROR_SUCCESS)
415 sockaddr_in recvAddr;
416 recvAddr.sin_family = AF_INET;
417 recvAddr.sin_port = htons(port);
418 recvAddr.sin_addr.s_addr = 0xffffffff;
424 if (ifa->Type == MIB_IF_TYPE_ETHERNET)
426 unsigned int nIPaddr;
427 unsigned int nIPmask;
429 if (inet_pton(AF_INET, ifa->IpAddressList.IpAddress.String, &nIPaddr) == 0 ||
430 inet_pton(AF_INET, ifa->IpAddressList.IpMask.String, &nIPmask) == 0)
434 recvAddr.sin_addr.s_addr = nIPaddr | (~nIPmask);
435 if (recvAddr.sin_addr.s_addr != (filterAddr | (~nIPmask)))
437 if (sendto(mUDPBroadcastSocket, sendBuf, size, 0, (sockaddr*)&recvAddr,
sizeof(recvAddr)) == size)
439 broadCastSent =
true;
449 struct ifaddrs* ifap =
nullptr;
450 if (getifaddrs(&ifap) == 0)
452 sockaddr_in recvAddr;
453 recvAddr.sin_family = AF_INET;
454 recvAddr.sin_port = htons(port);
455 recvAddr.sin_addr.s_addr = 0xffffffff;
461 if (ifa->ifa_addr->sa_family == AF_INET)
463 auto* sa = (
struct sockaddr_in *) ifa->ifa_addr;
464 auto ipAddr = sa->sin_addr.s_addr;
466 auto* saMask = (
struct sockaddr_in *) ifa->ifa_netmask;
467 auto ipMask = saMask->sin_addr.s_addr;
469 recvAddr.sin_addr.s_addr = ipAddr | (~ipMask);
470 if (recvAddr.sin_addr.s_addr != (filterAddr | (~ipMask)))
472 if (sendto(mUDPBroadcastSocket, sendBuf, size, 0, (sockaddr*)&recvAddr,
sizeof(recvAddr)) == size)
474 broadCastSent =
true;
485 return broadCastSent;
489 void CNetwork::SetErrorString()
492 char* error =
nullptr;
493 mLastError = GetLastError();
494 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
nullptr, mLastError, 0, reinterpret_cast<LPTSTR>(&error), 0,
nullptr);
495 sprintf(mErrorStr,
"%s", error);
499 char* error = strerror(mLastError);
500 if (error !=
nullptr)
502 sprintf(mErrorStr,
"%s", error);
523 IP_ADAPTER_INFO* pAdptInfo =
nullptr;
524 IP_ADAPTER_INFO* pNextAd =
nullptr;
529 erradapt = ::GetAdaptersInfo(pAdptInfo, &ulLen);
530 if (erradapt == ERROR_BUFFER_OVERFLOW)
532 pAdptInfo = (IP_ADAPTER_INFO*)malloc(ulLen);
533 erradapt = ::GetAdaptersInfo(pAdptInfo, &ulLen);
536 if (erradapt == ERROR_SUCCESS)
541 if (pNextAd->Type == MIB_IF_TYPE_ETHERNET)
545 if (inet_pton(AF_INET, pNextAd->IpAddressList.IpAddress.String, &addr) != 0)
547 return addr == nAddr;
550 pNextAd = pNextAd->Next;
555 struct ifaddrs* pAdptInfo =
nullptr;
556 struct ifaddrs* pNextAd =
nullptr;
557 if (getifaddrs(&pAdptInfo) == 0)
562 if (pNextAd->ifa_addr->sa_family == AF_INET)
564 struct sockaddr_in* pNextAd_in = (
struct sockaddr_in *)pNextAd->ifa_addr;
565 if (pNextAd_in->sin_addr.s_addr == nAddr)
570 pNextAd = pNextAd->ifa_next;
573 freeifaddrs(pAdptInfo);
int Receive(char *rtDataBuff, int nDataBufSize, bool bHeader, int nTimeout, unsigned int *ipAddr=nullptr)
unsigned short GetUdpServerPort()
bool CreateUDPSocket(unsigned short &nUDPPort, bool bBroadcast=false)
unsigned short GetUdpBroadcastServerPort()
bool Send(const char *pSendBuf, int nSize)
bool SendUDPBroadcast(const char *pSendBuf, int nSize, short nPort, unsigned int nFilterAddr=0)
bool Connect(const char *pServerAddr, unsigned short nPort)
bool IsLocalAddress(unsigned int nAddr) const