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); }
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; }
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; }
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; }