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();
}
Exemplo n.º 4
0
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;
}