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