首页 > 解决方案 > 从不同的进程服务器写入客户端

问题描述

我有一台由主机和一些从机组成的服务器(例如一个)

我希望主人在连接时分发客户端。

//Initialisation
struct sockaddr_in clientaddr;
socklen_t clientlen;
clientlen = (socklen_t)sizeof(clientaddr);
int listenfd = Open_listenfd(PORT);

//Children instanciation here
int pipe_in = 0;
for (int i = 0; i < NPROC; i++)
{
    int p[2];
    pipe(p);
    children[i].id=Fork();
    if(children[i].id == 0){
        close (p[1]);
        pipe_in=p[0];
        goto CHILDREN;
    }
    else{
        close (p[0]);
        children[i].pipe_to = p[1];
    }
}


//Master Loop
int curchild = 0;
while (1) {
    int connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);
    write(children[curchild].pipe_to, &connfd, sizeof(connfd));
    printf("Sent to slave %d\n",connfd);
    curchild = Next(curchild);
}

return 0;


//Slave Process
CHILDREN :
while (1) {
    int connfd;
    read(pipe_in, &connfd, sizeof(connfd));
    printf("Receveid from master %d\n",connfd);
    Rio_writen(connfd, "Test\n", 5);
    Close(connfd);
}

这里descriptor sent 和receiveid 类似,但是Rio_writen返回错误:Bad file descriptor

标签: csocketsserverpipe

解决方案


只有在创建子进程之前打开文件和套接字描述符时,它们才会传递给子进程。

例如:

  • 父级:接受新的 TCP 请求(从而接收新的connfd
  • 父母:分叉,创建一个新的孩子
  • 父母:将 传递connfd给新的孩子
  • Child:处理套接字连接

更多信息:如何将套接字从父进程传递给子进程 - StackOverflow


推荐阅读