예제 #1
0
void server::send_error(const std::string& msg, socket_ptr sock)
{
	ERR_CS << "[" << client_address(sock) << "]: " << msg << '\n';
	simple_wml::document doc;
	doc.root().add_child("error").set_attr_dup("message", msg.c_str());
	async_send_doc(sock, doc, std::bind(&server::handle_new_client, this, _1), null_handler);
}
예제 #2
0
파일: main.c 프로젝트: maerlyn/szamhalo2
int main(void) {
  struct sockaddr_storage their_addr;
  socklen_t addr_size;
  struct addrinfo hints, *res;
  int listener, new_fd;
  char msg[INET_ADDRSTRLEN];
  int yes = 1;
  pid_t newpid;
  size_t bytes;

  memset(&hints, 0, sizeof(hints));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_flags = AI_PASSIVE;
  getaddrinfo(NULL, PORT, &hints, &res);

  listener = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
  setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

  if (bind(listener, res->ai_addr, res->ai_addrlen) < 0) { perror("bind"); exit(1); }
  listen(listener, BACKLOG);

  addr_size = sizeof(their_addr);

  printf("figyelek\n");
  for(;;) {
    new_fd = accept(listener, (struct sockaddr*)&their_addr, &addr_size);

    newpid = fork();

    if (newpid == 0) { // gyerek
      close(listener);
      client_address(their_addr, msg);
      printf("%s", msg);
      send(new_fd, msg, strlen(msg), 0);
      bytes = read(new_fd, msg, sizeof msg -1);
      msg[bytes-2] = 0; //\r\n levagasa a vegerol

      if (0 == strcmp(msg, "SZULO")) {
        sprintf(msg, "szulo: %d\n", getppid());
      } else
      if (0 == strcmp(msg, "GYEREK")) {
        sprintf(msg, "gyerek: %d\n", getpid());
      } else
        strcpy(msg, "ismeretlen parancs\n");

      send(new_fd, msg, strlen(msg), 0);


      close(new_fd);
      exit(0); //enelkul forkbomba lesz, ketszeris ugy jartam, mire leesett :)
    } else { //szulo
      close(new_fd);
    }
  } //for(;;)

  close(listener);

  return 0;
}
예제 #3
0
파일: main.c 프로젝트: maerlyn/szamhalo2
int main(void) {
  struct sockaddr_storage their_addr;
  socklen_t addr_size;
  struct addrinfo hints, *res;
  int listener, new_fd;
  char msg[INET6_ADDRSTRLEN];
  int yes = 1;

  fd_set master, read_fds;
  int fdmax, i;

  memset(&hints, 0, sizeof(hints));
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_flags = AI_PASSIVE;
  getaddrinfo(NULL, PORT, &hints, &res);

  FD_ZERO(&master);
  FD_ZERO(&read_fds);

  for (; res != NULL; res = res->ai_next) {
    listener = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

    if (res->ai_family == AF_INET6) {
      setsockopt(listener, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(int));
    }

    if (bind(listener, res->ai_addr, res->ai_addrlen) < 0) { perror("bind"); exit(1); }
    listen(listener, BACKLOG);
    FD_SET(listener, &master);
    fdmax = listener;
    printf("listening on #%d\n", listener);
  }

  addr_size = sizeof(their_addr);

  for(;;) {
    read_fds = master;
    if (select(fdmax+1, &read_fds, NULL, NULL, NULL) < 0) { perror("select()"); exit(1); }

    for (i = 0; i <= fdmax; ++i) {
      if (FD_ISSET(i, &read_fds)) { //figyeldoda, kliens jott
        new_fd = accept(i, (struct sockaddr*) &their_addr, &addr_size);
        client_address(their_addr, msg);
        printf("%s", msg);
        send(new_fd, msg, strlen(msg), 0);
        close(new_fd);
      }
    }
  } //for(;;)

  close(listener);

  return 0;
}
예제 #4
0
void WorldServer::SendClientAuth(unsigned int ip, string account, string key, unsigned int account_id, uint8 version)
{
	ServerPacket *outapp = new ServerPacket(ServerOP_LSClientAuth, sizeof(ServerLSClientAuth));
	ServerLSClientAuth* slsca = (ServerLSClientAuth*)outapp->pBuffer;

	slsca->lsaccount_id = account_id;
	strncpy(slsca->name, account.c_str(), account.size() > 30 ? 30 : account.size());
	strncpy(slsca->key, key.c_str(), 10);
	slsca->lsadmin = 0;
	slsca->worldadmin = 0;
	slsca->ip = ip;
	slsca->version = version;

	in_addr in;
	in.s_addr = ip;connection->GetrIP();
	string client_address(inet_ntoa(in));
	in.s_addr = connection->GetrIP();
	string world_address(inet_ntoa(in));

	if(client_address.compare(world_address) == 0)
	{
		slsca->local = 1;
	}
	else if (client_address.find(db.LoadServerSettings("options", "local_network").c_str()) != string::npos)
	{
		slsca->local = 1;
	}
	else
	{
		slsca->local = 0;
	}

	connection->SendPacket(outapp);

	if (server_log->DumpIn())
	{
		DumpPacket(outapp);
	}
	delete outapp;
}