Socket::Socket(const sockaddr_in& addr, const std::string &minVer, const std::string& maxVer) : socket_(SAM_INVALID_SOCKET), servAddr_(addr), minVer_(minVer), maxVer_(maxVer) { #ifdef WIN32 if (instances_++ == 0) initWSA(); #endif init(); if (isOk()) handshake(); }
Socket::Socket(const Socket& rhs) : socket_(SAM_INVALID_SOCKET), servAddr_(rhs.servAddr_), minVer_(rhs.minVer_), maxVer_(rhs.maxVer_) { #ifdef WIN32 if (instances_++ == 0) initWSA(); #endif init(); if (isOk()) handshake(); }
Socket::Socket(const std::string& SAMHost, uint16_t SAMPort, const std::string& minVer, const std::string &maxVer) : socket_(SAM_INVALID_SOCKET), SAMHost_(SAMHost), SAMPort_(SAMPort), minVer_(minVer), maxVer_(maxVer) { #ifdef WIN32 if (instances_++ == 0) initWSA(); #endif memset(&servAddr_, 0, sizeof(servAddr_)); servAddr_.sin_family = AF_INET; servAddr_.sin_addr.s_addr = inet_addr(SAMHost.c_str()); servAddr_.sin_port = htons(SAMPort); init(); if (isOk()) handshake(); }
DWORD WINAPI listenNetGame(void *) { sockaddr_in sa; SOCKET sock_c; int sl; bool b; wrLog(lng(866, "Waiting for the other player")); for(;;){ sl= sizeof(sa); if((sock_c= accept(sock_l, (sockaddr *)&sa, &sl))==INVALID_SOCKET){ wrLog(lng(867, "Finished listening for requests from the internet")); break; } EnterCriticalSection(&netLock); b=isNetGame; isNetGame=true; LeaveCriticalSection(&netLock); if(b){ wr1(sock_c, C_BUSY); Sleep(1000); closesocket(sock_c); } else{ sock=sock_c; netGameIP=sa; initWSA(); DWORD id; ResumeThread(netGameThread=CreateThread(0, 0, netGameLoop, 0, CREATE_SUSPENDED, &id)); stopListen(); break; } } WSACleanup(); isListening=false; return 0; }
int main(int argc, char** argv) { if (argc < 2) { printf("Usage: %s <command> [additional options]\n", argv[0]); printf(" Commands:\n"); printf(" serial <COM> <baudrate>\n"); printf(" udpserver <address> <port>\n"); printf(" tcpserver <address> <port>\n"); printf(" udpclient <address> <port>\n"); printf(" tcpclient <address> <port>\n"); return 1; } // Set interrupt handler #if _WIN32 SetConsoleCtrlHandler((PHANDLER_ROUTINE) interruptHandler, TRUE); initWSA(); #else signal(SIGINT, interruptHandler); #endif if (strncmp(argv[1], "serial", 6) == 0) { // Monitor a serial port if (argc < 4) { printf("Usage: %s %s <COM> <baudrate>\n", argv[0], argv[1]); return 1; } SerialPort conn(argv[2], std::atoi(argv[3])); if (conn.isConnected()) { printf("Opened %s\n", argv[2]); char * buffer = new char[4096]; unsigned int len; memset(buffer, 0, 4096); while (!quit) { len = conn.read(buffer, 4096); printf(buffer); if (len > 0) { memset(buffer, 0, 4096); } } } } else if (strncmp(argv[1], "udpserver", 9) == 0) { // Echo server if (argc < 4) { printf("Usage: %s %s <address> <port>\n", argv[0], argv[1]); return 1; } UDPSocketServer conn(std::string(argv[2]), std::atoi(argv[3])); conn.server([](char * buffer, unsigned int buffer_len) { printf(buffer); }); if (conn.isListening()) { while (!quit) { Sleep(100); } conn.close(); } } else if (strncmp(argv[1], "tcpserver", 9) == 0) { // Echo server if (argc < 4) { printf("Usage: %s %s <address> <port>\n", argv[0], argv[1]); return 1; } TCPSocketServer conn(std::string(argv[2]), std::atoi(argv[3])); conn.server([](SOCKET clientId, unsigned int eventType, char * buffer, unsigned int buffer_len) { if (eventType == TCPSocketServer::CLIENT_CONNECT) { printf("New client connected\n"); } else if (eventType == TCPSocketServer::CLIENT_DISCONNECT) { printf("Client disconnected\n"); } else { printf(buffer); } }); if (conn.isListening()) { while (!quit) { Sleep(100); } conn.close(); } } else if (strncmp(argv[1], "udpclient", 9) == 0) { // Send a count every second if (argc < 4) { printf("Usage: %s %s <address> <port>\n", argv[0], argv[1]); return 1; } UDPSocketClient conn(std::string(argv[2]), std::atoi(argv[3])); if (conn.isConnected()) { std::chrono::time_point<std::chrono::system_clock> start, end; start = std::chrono::system_clock::now(); char * buffer = new char[4096]; memset(buffer, 0, 4096); int counter = 0; while (!quit) { printf("Sending %d\n", counter); std::string send = std::to_string(counter) + "\n"; conn.write(send.c_str(), (unsigned int) send.size()); counter++; Sleep(1000); } } } else if (strncmp(argv[1], "tcpclient", 9) == 0) { // Send a count every second if (argc < 4) { printf("Usage: %s %s <address> <port>\n", argv[0], argv[1]); return 1; } TCPSocketClient conn(std::string(argv[2]), std::atoi(argv[3])); if (conn.isConnected()) { std::chrono::time_point<std::chrono::system_clock> start, end; start = std::chrono::system_clock::now(); char * buffer = new char[4096]; memset(buffer, 0, 4096); int counter = 0; while (!quit) { printf("Sending %d\n", counter); std::string send = std::to_string(counter) + "\n"; conn.write(send.c_str(), (unsigned int)send.size()); counter++; Sleep(1000); } } } return 0; }