Как реализовать трехуровневую архитектуру в C с помощью программирования сокетов? - PullRequest
0 голосов
/ 17 июня 2020

У меня проблема с моим тестовым проектом net. Я должен реализовать трехуровневую архитектуру таким образом (см. Pi c ниже)

enter image description here

Не могли бы вы дать мне несколько идей? Я пробовал использовать fork () и pipe , но это не работает.

  • На мой взгляд, я должен fork () мой средний сервер (ServerN / Server C) всякий раз, когда клиент подключается с использованием бесконечного while l oop, в котором Я всегда использую функцию accept () , чтобы принять клиента

`

while(1)
        {     
          if((connfd = accept(listenfd, (struct sockaddr *)&clientAddr, &addrlen)) == -1)
            {
                perror("Accept : ");
                exit(1);
            }
          if ( (pid = fork() ) == 0 ) { /* child */
             printf("client accepted\n");
             close(listenfd);
             ...
  • Затем я fork () и позволить дочернему элементу выполнять операции с только что прибывшими клиентами.
  • Но я также должен подключить сгенерированный дочерний элемент к ServerM, который является сервером, который выполняет SQL операции по извлечению данных из БД. Это должно быть так

`

while(1)
        {     
          if((connfd = accept(listenfd, (struct sockaddr *)&clientAddr, &addrlen)) == -1)
            {
                perror("Accept : ");
                exit(1);
            }
          if ( (pid = fork() ) == 0 ) { /* child */
             printf("client accepted\n");
             close(listenfd);
             connect(sockM, (struct sockaddr*) &serverMAddr, sizeof(serverMAddr);
             // The child comunicate with serverM and clientN from now  
             ...

ServerM должен делать то же самое, только без connect (), но только accept (). Каждый раз, когда дочерний сервер ServerN пытается подключиться к ServerM, он должен fork (), а его дочерний элемент должен выполнять операции. Таким образом, соединение от childM к childN с clientN. Работает только в первый раз, потом со второго дочернего N не подключается () . Я много раз читал, что мне нужно использовать select (), но мне не удалось . Не могли бы вы помочь мне предоставить коды или идеи? Буду очень признателен. Спасибо.

...