Exemple #1
0
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() );
}
Exemple #2
0
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);
	}
}
Exemple #3
0
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;
}