コード例 #1
0
ファイル: SocketLockService.c プロジェクト: luantao/SFP
queue_unit* find_in_queue(queue_unit *unit, char *key) {
    if (unit == NULL || strcmp(unit->key, key) == 0) {
        return unit;
    } else {
        return find_in_queue(unit->next, key);
    }
}
コード例 #2
0
void graph::ucs(const std::string& v1, const std::string& v2, 
                std::ofstream& fp, std::ofstream& fl,
                double (graph::* cost_f) (unsigned, unsigned) const) const
{
    unsigned i1 = get_index(v1);
    unsigned i2 = get_index(v2);
    ucs_node_queue q;
    std::set<unsigned> e;
    std::vector<unsigned> t(1, i1);
    q.insert(ucs_node(i1, t, 0));
    while (!q.empty()) {
        ucs_node n = *q.begin();
        fl << m_names[n.m_vertex] << "\n";
        q.erase(q.begin());
        if (n.m_vertex == i2) {
            for (unsigned j = 0; j < n.m_path.size(); ++j) {
                fp << m_names[n.m_path[j]] << "\n";
            }
            return;
        }
        e.insert(n.m_vertex);
        std::vector<unsigned>::const_iterator i;
        for (i = m_adjacent_vertices[n.m_vertex].begin(); i != m_adjacent_vertices[n.m_vertex].end(); ++i) {
            if (e.find(*i) == e.end()) {
                ucs_node_queue::iterator qi = find_in_queue(q, *i);
                if (qi == q.end()) {
                    std::vector<unsigned> np(n.m_path);
                    np.push_back(*i);
                    q.insert(ucs_node(*i, np, n.m_cost + (this->*cost_f)(n.m_vertex, *i)));
                } else {
                    if (n.m_cost + (this->*cost_f)(n.m_vertex, *i) < qi->m_cost) {
                        q.erase(qi);
                        std::vector<unsigned> np(n.m_path);
                        np.push_back(*i);
                        q.insert(ucs_node(*i, np, n.m_cost + (this->*cost_f)(n.m_vertex, *i)));
                    }
                }
            }
        }
    }
}
コード例 #3
0
ファイル: SocketLockService.c プロジェクト: luantao/SFP
int main(int argc, char** argv) {
    queue_unit use_list, wait_list, *use_p, *wait_p;
    if (init_queue(&use_list) == -1) {
        printf("use Queue Initialization failed");
        exit(EXIT_FAILURE);
    }
    if (init_queue(&wait_list) == -1) {
        printf("wait Queue Initialization failed");
        exit(EXIT_FAILURE);
    }
    int opt, cfp, len, sel, i, temp, port = PORT;
    int keepAlive = 1; // 开启keepalive属性
    int keepIdle = 5; // 如该连接在5秒内没有任何数据往来,则进行探测 
    int keepInterval = 5; // 探测时发包的时间间隔为5 秒
    int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
    struct sockaddr_in client_sockaddr, service_sockaddr;
    char buf[1024];
    while ((opt = getopt(argc, argv, "hp:")) != -1) {
        switch (opt) {
            case 'p':port = atoi(optarg);
                break;
            case 'h':
            default:
                printf("Welcome to use SocketLock For PHP\n"
                        "-h\t\t\t help \n"
                        "-p\t\t\t listen port\n");
        }
    }
    signal(SIGQUIT, sigroutine);
    signal(SIGKILL, sigroutine);
    sfp = socket(AF_INET, SOCK_STREAM, 0);
    setsockopt(sfp, SOL_SOCKET, SO_KEEPALIVE, (void *) &keepAlive, sizeof (keepAlive));
    setsockopt(sfp, SOL_TCP, TCP_KEEPIDLE, (void*) &keepIdle, sizeof (keepIdle));
    setsockopt(sfp, SOL_TCP, TCP_KEEPINTVL, (void *) &keepInterval, sizeof (keepInterval));
    setsockopt(sfp, SOL_TCP, TCP_KEEPCNT, (void *) &keepCount, sizeof (keepCount));
    service_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    service_sockaddr.sin_family = AF_INET;
    service_sockaddr.sin_port = htons(port);
    if (-1 == bind(sfp, (struct sockaddr *) &service_sockaddr, sizeof (struct sockaddr))) {
        perror("bind error");
        exit(EXIT_FAILURE);
    }
    printf("bind success!\n");
    if (-1 == listen(sfp, MAX_NUM)) {
        perror("listen error");
        exit(EXIT_FAILURE);
    }
    printf("listen success!\n");
    socklen_t sl = sizeof (struct sockaddr_in);
    fd_set readset, bufset;
    FD_ZERO(&readset);
    FD_ZERO(&bufset);
    FD_SET(sfp, &readset);
    struct timeval tm;
    while (1) {
        tm.tv_sec = 5;
        tm.tv_usec = 0;
        memcpy(&bufset, &readset, sizeof (fd_set));
        sel = select(MAX_NUM + 1, &bufset, NULL, NULL, &tm);
        if (sel < 0) {
            perror("select error");
            exit(EXIT_FAILURE);
        }
        if (sel == 0) {
            printf("timeout!\n");
            printf("----use Queue!----\n");
            echo_queue(&use_list);
            printf("----wait Queue!----\n");
            echo_queue(&wait_list);
            continue;
        }
        if (FD_ISSET(sfp, &bufset)) {
            cfp = accept(sfp, (struct sockaddr *) &client_sockaddr, &sl);
            if (cfp == -1) {
                perror("accept error");
                exit(EXIT_FAILURE);
            }
            write(cfp, CONNECT_SIGNAL, strlen(CONNECT_SIGNAL));
            FD_SET(cfp, &readset);
            client_fd[cfp] = 1;
            printf("client success %d \n", cfp);
        }

        for (i = 0; i < MAX_NUM; i++) {
            if (FD_ISSET(i, &bufset)) {
                if (client_fd[i] == 1) {
                    len = read(i, buf, 1024);
                    if (len <= 0) {
                        client_fd[i] = 0;
                        FD_CLR(i, &readset);
                        close(i);
                        del_queue(&use_list, i, buf); //删除在用队列里的数据
                        printf("close: %d %s\n", i, buf);

                        use_p = find_in_queue(&wait_list, buf); //查找等待队列中是否有数据
                        if (use_p != NULL) {//如果有等待
                            temp = use_p->socket_num;
                            del_queue(&wait_list, temp, buf); //从等待队列中去除
                            printf("client: %d %s using\n", temp, buf);
                            add_queue(&use_list, temp, buf); //加入在用队列
                            write(cfp, CONNECT_SIGNAL, strlen(CONNECT_SIGNAL)); //发送通过信号
                        }
                    } else {
                        buf[len] = '\0';
                        use_p = find_in_queue(&use_list, buf);
                        if (use_p == NULL) {
                            printf("client: %d %s using\n", i, buf);
                            add_queue(&use_list, i, buf);
                            write(cfp, CONNECT_SIGNAL, strlen(CONNECT_SIGNAL)); //发送通过信号
                        } else {
                            add_queue(&wait_list, i, buf); //不许通过进入等待队列
                        }
                    }
                }

            }
        }
    }
    close(sfp);
    return (EXIT_SUCCESS);
}
コード例 #4
0
ファイル: handlers_playqueue.c プロジェクト: Geotto/audacious
void playqueue_get_queue_position (int argc, char * * argv)
{
    int pos = check_args_playlist_pos (argc, argv);
    audtool_report ("%d", find_in_queue (pos - 1) + 1);
}
コード例 #5
0
ファイル: handlers_playqueue.c プロジェクト: Geotto/audacious
void playqueue_is_queued (int argc, char * * argv)
{
    int pos = check_args_playlist_pos (argc, argv);
    find_in_queue (pos - 1); /* exits if not found */
    audtool_report ("OK");
}