如何在c++代码中使用管道

How can I use pipe in this code C++?

本文关键字:管道 代码 c++      更新时间:2023-10-16

我遇到了大麻烦,因为我不知道如何做到这一点。我只需要创建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);
}

。当客户端通过身份验证成功后,登录管理器,即可向服务器发送数据。如果一个客户端已连接,而另一个客户端已登录,则第二个客户端必须用"您已断开连接"消息踢开第一个客户端。我怎么能用叉子和管子来做呢?我试着读了一些关于这方面的东西,但是我有点困惑。

谢谢。

我不确定你的项目的具体设计,但如果你使用fork()从现有的一个创建一个新的客户端,你想使用管道()来通信,这里是一个示例代码。

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 pipen");
    write(pfds[1], "New Client", 11);
    printf(" CHILD CLIENT: exitingn");
    exit(0);
} else {
    printf("PARENT CLIENT: reading from pipen");
    read(pfds[0], buf, 11);
    printf("PARENT CLIENT: read "%s"n", buf);
    //Take appropriate Action upon read!!!
    wait(NULL);
}

我个人认为对于这种通信(信号或共享内存),有比使用管道更好的选择

看看ZMQ: http://www.zeromq.org/