Как я могу использовать pipe в этом коде C ++? - PullRequest
4 голосов
/ 31 октября 2011

У меня большие проблемы, потому что я не знаю, как это сделать. Мне нужно создать только 2 процесса, которые могут взаимодействовать. Это код:

/* Wrappers */
this->sock_fd = this->w_socket();
this->w_bind();
this->w_listen();

std::cout << "[info] Server is running..." << std::endl;

while(1)
{
    /*Connection stuff */
    struct sockaddr_in client_addr;
    int client_fd = this->w_accept(&client_addr);
    char client_ip[64];
    int client_port = ntohs(client_addr.sin_port);
    inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip));
    std::cout << "[info] Connection from (" << client_ip
        << ", " << client_port << ")" << std::endl;

    /*Login manager*/
    ...

    /* Crate PID */
    int pid = fork();
    if (pid == 0)
    {
        close(this->sock_fd);
        this->manage(client_fd, client_ip, client_port);
        exit(0);
    }   
    /* End connection */
    close(client_fd);
}

Хорошо. Когда клиент успешно аутентифицирован после входа в систему, администратор может отправлять данные на сервер. Если клиент подключен, а другой вошел в систему, второй должен пнуть первого клиента с сообщением «Вы были отключены». Как я могу использовать вилку и трубу, чтобы сделать это? Я пытался прочитать что-то об этом, но я немного запутался в этом.

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Я не уверен насчет конкретного дизайна вашего проекта, но если вы используете fork () для создания нового клиента из существующего и хотите использовать pipe () для связи, вот пример кода.

int pfds[2];         //pipe() always return pair of file descriptors(fds).
char buf[30];

pipe(pfds);         //fds will be stored in pfds.

if (!fork()) {
    printf(" CHILD CLIENT: writing to pipe\n");
    write(pfds[1], "New Client", 11);
    printf(" CHILD CLIENT: exiting\n");
    exit(0);
} else {
    printf("PARENT CLIENT: reading from pipe\n");
    read(pfds[0], buf, 11);
    printf("PARENT CLIENT: read \"%s\"\n", buf);
    //Take appropriate Action upon read!!!
    wait(NULL);
}

Лично я считаю, что есть более подходящие варианты, чем использование каналов для этого вида связи (сигналы или общая память).

0 голосов
/ 04 ноября 2011

взгляните на ZMQ: http://www.zeromq.org/

...