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