Esempio n. 1
0
void Application::newInstanceConnected() {
	DEBUG_LOG(("Application Info: new local socket connected"));
	for (QLocalSocket *client = server.nextPendingConnection(); client; client = server.nextPendingConnection()) {
		clients.push_back(ClientSocket(client, QByteArray()));
		connect(client, SIGNAL(readyRead()), this, SLOT(readClients()));
		connect(client, SIGNAL(disconnected()), this, SLOT(removeClients()));
	}
}
ClientSocket ServerSocket::next(int flags) {
  struct sockaddr_storage peer_addr;
  socklen_t peer_addr_size = sizeof(sockaddr_storage);
  memset(&peer_addr, 0, sizeof(peer_addr));

  //Poll the socket to see if a new connection has arrived
  //Wait until data is ready
  pollfd ufd;
  ufd.fd = sock_fd;
  ufd.events = POLLIN;
  //Wait up to 10 milliseconds for the poll to finish
  int result = poll(&ufd, 1, 10);
  //Accept a new socket is an input event is polled
  if (result == 1 and (ufd.revents & (POLLERR | POLLHUP | POLLNVAL)) == 0) {
    int in_sock = accept4(sock_fd, (struct sockaddr*)&peer_addr, &peer_addr_size, flags);

    std::string ip = "";

    if (0 <= in_sock) {
      //Get the ip address of this new connection
      char addr_buf[1000] = {0};
      int err = getnameinfo((struct sockaddr*)&peer_addr, peer_addr_size,
          addr_buf, sizeof(addr_buf) - 1, NULL, 0, NI_NUMERICHOST);
      if (err != 0) {
        std::cerr<<"Error getting client address: "<<gai_strerror(errno)<<'\n';
      }

      ip = std::string(addr_buf);
      std::cerr<<"Found ip address "<<addr_buf<<'\n';
    }
    //Don't print an error if the socket is simply non-blocking
    else if (errno != EAGAIN and errno != EWOULDBLOCK) {
      std::cerr<<"Socket failure: "<<strerror(errno)<<"\n";
    }

    //Control of the socket is handed over to the ClientSocket class.
    //The socket may be invalid if no new connection was available
    return ClientSocket(_port, ip, in_sock);
  }
  else {
    //Return an invalid socket
    return ClientSocket(_port, "", -1);
  }
}
void GameEngine::Initialize(const SDL_Rect& screenSize)
{
  std::cout << "GameEngine::Initialize" << std::endl;

  _socket = ClientSocket("0.0.0.0", "5001");

  SDL_Init(SDL_INIT_EVERYTHING);
  srand((unsigned int)time(NULL));

  // Soundstuff
  int audioRate = 22050;
  Uint16 audioFormat = AUDIO_S16SYS;
  int audioChannels = 2;
  int audioBuffers = 4096;

  if(Mix_OpenAudio(audioRate, audioFormat, audioChannels, audioBuffers) != 0)
  {
    std::cerr << "Unable to initialize audio: " << Mix_GetError()
      << std::endl;
    throw Mix_GetError();
  }

  // Activate anti-aliasing
  SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
  // Set AA level to 2
  SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);

  if (SDL_SetVideoMode(screenSize.x, screenSize.y, 32,
        SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL) == NULL)
  {
    /* Ugly hack to make it work even if the system doesn't support
       multisampling. [FIXME]*/
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);
    if (SDL_SetVideoMode(screenSize.x, screenSize.y, 32,
          SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL) == NULL)
    {
      throw SDL_GetError();
    }
  }

  glViewport(0, 0, screenSize.x, screenSize.y);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(0, screenSize.x, 0, screenSize.y, 1, -1);
  glMatrixMode(GL_MODELVIEW);
  glClearColor(0, 0.1f, 0, 1.0f);
  glClearDepth(1.0f);

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glAlphaFunc(GL_GREATER, 0.1f);

  PushState(new GSMain());
}
Esempio n. 4
0
void RemoteSlaveProcess::Open(const char *host, int port, const char *cmdline, const char *envptr, int to)
{
    SVRLOG("RemoteSlaveProcess(" << host << ":" << port << ")=" << cmdline);
    Kill();

    timeout = to;
    Socket::Init();
    String localhost;
    if(host == 0 || *host == 0)
    {
        localhost = Socket::GetHostName();
        host = localhost;
    }
    if(port == 0)
        port = DEFAULT_PORT;
    terminated = false;
    current_part = 0;
    output[0] = output[1] = output[2] = Null;
    if(!ClientSocket(socket, host, port, true, NULL, REQUEST_TIMEOUT))
        throw Exc(NFormat(t_("Opening host '%s' / port %d failed, error = %s"), host, port, Socket::GetErrorText()));
    int len = (int)strlen(cmdline);
    if(envptr && *envptr) {
        const char *e = envptr;
        while(*e)
            e = e + strlen(e) + 1;
        socket.Write(":");
        socket.Write(ASCII85Encode(String(envptr, e + 1)));
        socket.Write("\n");
    }
    socket.Write("=");
    socket.Write(cmdline, len + 1); // send terminating 0 as well
    Recv(0, timeout);
    if(output[0][0] == '-')
        throw Exc(NFormat(t_("Error running process: %s\nCommand: %s"), output[0].Begin() + 1, cmdline));

    if(output[0] != "+")
        throw Exc(NFormat(t_("Communication error; process = %s"), cmdline));
}
Esempio n. 5
0
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/,
    LPSTR /*lpCmdLine*/, int /*nShowCmd*/)
{
#ifdef _DEBUG
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
/*	_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
	_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
	_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG); */
//	_CrtSetBreakAlloc(254);
#endif
	
	hInst = hInstance;
	CoInitialize(NULL);

	WSADATA wsa;
	if (0 != WSAStartup(MAKEWORD(2, 0), &wsa))
		die("Failed to init network");

	SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);

	struct sockaddr_in sin;
	memset(&sin, 0, sizeof sin);

	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = INADDR_ANY;
	sin.sin_port = htons(1338);

	if (SOCKET_ERROR == bind(serverSocket, (struct sockaddr *)&sin,
	    sizeof(sin)))
		die("Could not start server");

	while (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR)
		; /* nothing */

	ATOM mainClass      = registerMainWindowClass(hInstance);
	ATOM trackViewClass = registerTrackViewWindowClass(hInstance);
	if (!mainClass || !trackViewClass)
		die("Window Registration Failed!");

	trackView = new TrackView();

	hwnd = CreateWindowExW(
		0,
		mainWindowClassName,
		mainWindowTitleW,
		WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
		CW_USEDEFAULT, CW_USEDEFAULT, // x, y
		CW_USEDEFAULT, CW_USEDEFAULT, // width, height
		NULL, NULL, hInstance, NULL
	);

	if (NULL == hwnd)
		die("Window Creation Failed!");

	int argc;
	LPWSTR *argv = argv = CommandLineToArgvW(GetCommandLineW(), &argc);
	if (argv && argc > 1) {
		if (argc > 2) {
			char prog[MAX_PATH];
			GetModuleFileNameA(NULL, prog, sizeof(prog));
			die("usage: %s [filename.rocket]", prog);
		}
		loadDocument(argv[1]);
	} else
		fileNew();
	
	HACCEL accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
	
	ShowWindow(hwnd, TRUE);
	UpdateWindow(hwnd);
	
	bool done = false;
	MSG msg;
	bool guiConnected = false;
	while (!done) {
		SyncDocument *doc = trackView->getDocument();
		if (!doc->clientSocket.connected()) {
			SOCKET clientSocket = INVALID_SOCKET;
			fd_set fds;
			FD_ZERO(&fds);
#pragma warning(suppress: 4127)
			FD_SET(serverSocket, &fds);
			struct timeval timeout;
			timeout.tv_sec = 0;
			timeout.tv_usec = 0;
			
			// look for new clients
			if (select(0, &fds, NULL, NULL, &timeout) > 0)
			{
				SendMessage(statusBarWin, SB_SETTEXT, 0, (LPARAM)"Accepting...");
				sockaddr_in client;
				clientSocket = clientConnect(serverSocket, &client);
				if (INVALID_SOCKET != clientSocket)
				{
					char temp[256];
					snprintf(temp, 256, "Connected to %s", inet_ntoa(client.sin_addr));
					SendMessage(statusBarWin, SB_SETTEXT, 0, (LPARAM)temp);
					doc->clientSocket = ClientSocket(clientSocket);
					clientIndex = 0;
					doc->clientSocket.sendPauseCommand(true);
					doc->clientSocket.sendSetRowCommand(trackView->getEditRow());
					guiConnected = true;
				}
				else SendMessage(statusBarWin, SB_SETTEXT, 0, (LPARAM)"Not Connected.");
			}
		}

		if (doc->clientSocket.connected()) {
			ClientSocket &clientSocket = doc->clientSocket;

			// look for new commands
			while (clientSocket.pollRead())
				processCommand(clientSocket);
		}

		if (!doc->clientSocket.connected() && guiConnected) {
			doc->clientSocket.clientPaused = true;
			InvalidateRect(trackViewWin, NULL, FALSE);
			SendMessage(statusBarWin, SB_SETTEXT, 0, (LPARAM)"Not Connected.");
			guiConnected = false;
		}
		
		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if (!TranslateAccelerator(hwnd, accel, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
				if (WM_QUIT == msg.message) done = true;
			}
		}
		Sleep(1);
	}

	closesocket(serverSocket);
	WSACleanup();

	delete trackView;
	trackView = NULL;

	UnregisterClassW(mainWindowClassName, hInstance);
	return int(msg.wParam);
}