void handle_event(int epfd, struct epoll_event ev) { struct fdinfo *fdinfo = ev.data.ptr; switch (fdinfo->type) { case LSOCK: accept_one(epfd, fdinfo->fd); break; case CLIENT: print_event(fdinfo->fd, ev); if (ev.events & EPOLLHUP) { kill_cli(epfd, fdinfo); return; } if (ev.events & EPOLLIN) { handle_cli(fdinfo); } if (ev.events & EPOLLRDHUP) { handle_cli(fdinfo); kill_cli(epfd, fdinfo); return; } break; } }
void cli_thread_function() { SWSS_LOG_ENTER(); cli_server_socket = socket(AF_INET, SOCK_STREAM, 0); if (cli_server_socket < 0) { SWSS_LOG_ERROR("open socket failed, errno: %s", strerror(errno)); return; } struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); serv_addr.sin_port = htons(CLI_PORT); if (bind(cli_server_socket, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) != 0) { SWSS_LOG_ERROR("bind socket failed, errno: %s", strerror(errno)); close(cli_server_socket); return; } const int backlog = 5; if (listen(cli_server_socket, backlog) != 0) { SWSS_LOG_ERROR("listen on socket failed, errno: %s", strerror(errno)); close(cli_server_socket); return; } while (run_cli) { struct sockaddr_in cli_addr; memset(&cli_addr, 0, sizeof(cli_addr)); socklen_t clilen = sizeof(cli_addr); SWSS_LOG_NOTICE("accepting connections for cli"); cli_client_socket = accept(cli_server_socket, (struct sockaddr *) &cli_addr, &clilen); if (cli_client_socket < 0) { // don't log when run is false, that's mean we closed socket if (run_cli) { SWSS_LOG_ERROR("accept failed, errno: %s", strerror(errno)); } break; } SWSS_LOG_NOTICE("client connected to cli"); // we allow only 1 connection at given time handle_cli(); close(cli_client_socket); } close(cli_server_socket); }