void basic_server_buffer<Document, Selector>:: on_net_command_query(const net6::packet& pack, const user& from) { unsigned int index = 0; command_query query(pack, index); command_result result = m_command_map.exec_command(from, query); net6::packet reply_pack("obby_command_result"); result.append_packet(reply_pack); net6_server().send(reply_pack, from.get_net6() ); }
void basic_server_buffer<Document, Selector>:: on_net_user_colour(const net6::packet& pack, const user& from) { colour colour = pack.get_param(0).net6::parameter::as<obby::colour>(); // Check new user colour for conflicts if(!basic_buffer<Document, Selector>::check_colour(colour, &from) ) { net6::packet reply_pack("obby_user_colour_failed"); net6_server().send(reply_pack, from.get_net6() ); } else { user_colour_impl(from, colour); } }
int main(int argc, char **argv) { if (argc < 6) { DERROR("Usage: %s <id> <idflag> <vote_id> <port> <I/O timeout>\n", argv[0]); exit(-1); } set_signal(); id = atoi(argv[1]); idflag = atoi(argv[2]); vote_id = atoi(argv[3]); port = atoi(argv[4]); iotimeout = atoi(argv[5]); //DINFO("id: %llu, idflag: %d\nvote_id: %llu\nport: %d\ntimeout: %d\n", id, idflag, vote_id, port, iotimeout); listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd == -1) { DERROR("socket: %s\n", strerror(errno)); MEMLINK_EXIT; } int flag = 1; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); setsockopt(listenfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); struct sockaddr_in s; bzero(&s, sizeof(s)); s.sin_family = AF_INET; s.sin_addr.s_addr = htonl(INADDR_ANY); s.sin_port = htons(port); int ret; ret = bind(listenfd, (struct sockaddr *)&s, sizeof(s)); if (ret == -1) { DERROR("bind: %s\n", strerror(errno)); MEMLINK_EXIT; } if (listen(listenfd, 128) == -1) { DERROR("listen: %s\n", strerror(errno)); MEMLINK_EXIT; } int clientfd = socket(AF_INET, SOCK_STREAM, 0); if (clientfd == -1) { DERROR("socket: %s\n", strerror(errno)); MEMLINK_EXIT; } setsockopt(clientfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); s.sin_family = AF_INET; s.sin_port = htons(11010); inet_pton(AF_INET, VOTE_HOST, &s.sin_addr); ret = connect(clientfd, (struct sockaddr *)&s, sizeof(s)); if (ret == -1) { DERROR("connect: %s\n", strerror(errno)); MEMLINK_EXIT; } char buf[1024]; int count = pack_vote(buf, id, idflag, vote_id, port); cmd_vote_unpack(buf+CMD_REQ_HEAD_LEN); if (client_writen(clientfd, buf, count, iotimeout) != count) { DERROR("write count should be %d\n", count); set_linger(clientfd); close(clientfd); return -1; } fd_set rset; FD_ZERO(&rset); int closed = 0; while (1) { if (closed == 0) FD_SET(clientfd, &rset); FD_SET(listenfd, &rset); int maxfd = clientfd > listenfd ? clientfd : listenfd; ret = select(maxfd+1, &rset, NULL, NULL, NULL); if (ret < 0) { if (errno == EINTR) { continue; } else { DERROR("*** select error: %s\n", strerror(errno)); exit(-1); } } if (FD_ISSET(listenfd, &rset)) { clientfd = accept(listenfd, NULL, 0); closed = 0; } if (FD_ISSET(clientfd, &rset)) { count = read_cmd_response(clientfd, buf); if (count < 0) { DERROR("response error\n"); return -1; } else if (count == 0) { DINFO("*** voter closed\n"); close(clientfd); closed = 1; FD_CLR(clientfd, &rset); continue; } char *ptr = buf; char ip[INET_ADDRSTRLEN]; uint16_t pt; uint64_t v_id; uint8_t cmd; short rcode; memcpy(&cmd, ptr, sizeof(cmd)); ptr += sizeof(cmd); count -= sizeof(cmd); DINFO("cmd: %u\n", cmd); switch (cmd) { case CMD_VOTE_DETECT: reply_pack(clientfd); break; case CMD_VOTE_UPDATE: DINFO("*** UPDATE\n"); ret = unpack_voteid(ptr, &v_id); DINFO("voteid: %llu\n", (unsigned long long)v_id); ptr += ret; count -= ret; if (master == 1) { DINFO("I'm master\n"); } else { DINFO("I'm backup\n"); } while (count > 0) { ret = unpack_votehost(ptr, ip, &pt); DINFO("HOST: %s(%d)\n", ip, pt); ptr += ret; count -= ret; } if (master == 1) { replyok(clientfd); } else { replyerr(clientfd); } break; case CMD_VOTE: memcpy(&rcode, ptr, sizeof(rcode)); ptr += sizeof(rcode); count -= sizeof(rcode); if (rcode == CMD_VOTE_BACKUP) master = 0; switch (rcode) { case CMD_VOTE_WAIT: DINFO("I should wait vote finished\n"); break; case CMD_VOTE_MASTER: master = 1; case CMD_VOTE_BACKUP: DINFO("VOTE SUCCESS\n"); ret = unpack_voteid(ptr, &v_id); DINFO("voteid: %llu\n", (unsigned long long)v_id); vote_id = v_id; ptr += ret; count -= ret; if (master == 1) { DINFO("I'm master\n"); } else { DINFO("I'm backup\n"); } while (count > 0) { ret = unpack_votehost(ptr, ip, &pt); DINFO("HOST: %s(%d)\n", ip, pt); ptr += ret; count -= ret; } replyok(clientfd); break; case CMD_VOTE_NONEED: DINFO("*** no need vote\n"); break; case MEMLINK_ERR_VOTE_PARAM: DERROR("id flag error: %d\n", idflag); break; default: break; } break; default: break; } } } return 0; }