diff options
Diffstat (limited to 'src/wx')
-rw-r--r-- | src/wx/Platform.cpp | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/src/wx/Platform.cpp b/src/wx/Platform.cpp index 482b886..3beca2f 100644 --- a/src/wx/Platform.cpp +++ b/src/wx/Platform.cpp @@ -17,14 +17,90 @@ */ #include <stdio.h> +#include <stdlib.h> +#include <string.h> #include "../Platform.h" +#ifdef __WXMSW__ + #include <winsock2.h> + #include <ws2tcpip.h> + #define socket_t SOCKET + #define sockaddr_t SOCKADDR + #define pcap_dev_name description +#else + #include <unistd.h> + #include <arpa/inet.h> + #include <sys/socket.h> + #define socket_t int + #define sockaddr_t struct sockaddr + #define closesocket close + #define pcap_dev_name name +#endif + +#ifndef INVALID_SOCKET +#define INVALID_SOCKET (socket_t)-1 +#endif + namespace Platform { -// +socket_t MPSocket; +sockaddr_t MPSendAddr; + + +bool MP_Init() +{ + BOOL opt_true = TRUE; + int res; + + MPSocket = socket(AF_INET, SOCK_DGRAM, 0); + if (MPSocket < 0) + { + return false; + } + + res = setsockopt(MPSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(BOOL)); + if (res < 0) + { + closesocket(MPSocket); + MPSocket = INVALID_SOCKET; + return false; + } + + sockaddr_t saddr; + saddr.sa_family = AF_INET; + *(u32*)&saddr.sa_data[2] = htonl(INADDR_ANY); + *(u16*)&saddr.sa_data[0] = htons(7064); + res = bind(MPSocket, &saddr, sizeof(sockaddr_t)); + if (res < 0) + { + closesocket(MPSocket); + MPSocket = INVALID_SOCKET; + return false; + } + + res = setsockopt(MPSocket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(BOOL)); + if (res < 0) + { + closesocket(MPSocket); + MPSocket = INVALID_SOCKET; + return false; + } + + MPSendAddr.sa_family = AF_INET; + *(u32*)&MPSendAddr.sa_data[2] = htonl(INADDR_BROADCAST); + *(u16*)&MPSendAddr.sa_data[0] = htons(7064); + + return true; +} + +void MP_DeInit() +{ + if (MPSocket >= 0) + closesocket(MPSocket); +} } |