Пишите клиенту с другого сервера процессов - PullRequest
0 голосов
/ 31 марта 2020

У меня есть сервер, сделанный из мастера и нескольких подчиненных (один для примера)

Я бы хотел, чтобы мастер распределял клиентов по соединению.

//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);
}

Здесь дескриптор отправлен и receiveid похожи, но Rio_writen возвращает ошибку: Неверный дескриптор файла

1 Ответ

1 голос
/ 31 марта 2020

Дескрипторы файлов и сокетов передаются дочерним процессам, только если они открыты до создания дочерних процессов.

Например:

  • Parent: принимает новый TCP-запрос (таким образом, получая новый connfd)
  • Parent: форки, создание нового дочернего элемента
  • Parent: передает connfd новому дочернему элементу
  • Дочерний объект: обрабатывает соединение с сокетом

Дополнительная информация: Как передать сокет от родительского процесса к дочернему процессу - StackOverflow

...