Сервер C работает, но не выводится - PullRequest
0 голосов
/ 14 мая 2018

первый вопрос, заданный на SO.Не англ, так что я мог ошибиться, и мои комментарии на итальянском.В настоящее время проблема с моей реализацией C Server.Код выполняется без ошибок, но когда я его извиняю, он просто ничего не показывает.Я попытался разбить код и разместить несколько отпечатков, чтобы показать, где он «блокируется», но не могу прийти к выводу.Вот код:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>

struct sockaddr_in address;
struct sockaddr_in local;
//definisco la struttura per gli header composta dal nome e dal valore
struct header {
        char * nome;
        char * valore;
};
struct header h[100];

int main() {
        printf("qui");
        int s; //istanza  del socket
        int newS; //istanza del socket del server
        int newS2; //socket per la connessione al client
        int site; //istanza file ricevuti
        int conn_max = 10; //istnza connessionni massime server
        char request[1000]; //istanza della response
        int primiduepunti = 0;
        int sin_size = 0;
        int j = 0; //contatore
        int i = 0; //contatore
        s = socket(AF_INET, SOCK_STREAM, 0); //creazione socket
        //Configurazione indirizzo IP locale
        ((char *)&local.sin_addr)[0] = 127;
        ((char *)&local.sin_addr)[1] = 0;
        ((char *)&local.sin_addr)[2] = 0;
        ((char *)&local.sin_addr)[3] = 1;
        local.sin_family = AF_INET;
        local.sin_port = htons(1050);
        newS = bind(s, (struct sockaddr*)&local, sizeof(struct sockaddr_in)); //assegna un indirizzo locale ad un socket
        if( newS == -1) {
                perror("Bind fallita");
                return 1;
        }
        newS = listen(s, conn_max); //metto in ascolto il nostro server
        while(1) {
                sin_size = sizeof(struct sockaddr_in);
                printf("qua");
                newS2 = accept(s,(struct sockaddr*)&local, &sin_size);  //Crea un nuovo socket che è connesso al client
                printf("Accettata connessione con client \n");
                fflush(stdout);
                if(fork == 0) {
                        if(newS2 == -1) {
                                perror("Accept fallita");
                                return 1;
                        }
                }
        h[0].nome = request;
        h[0].valore = h[0].nome;
        //ciclo per riempire gli header; read ritorna il numero di elementi letti
        for(i = 0, j = 0; (newS = read(newS2, request+i, 1)) >0; i++) {
                if((i>1) && (request[i] == '\r') && (request[i+1] == '\n')) {
                        primiduepunti = 1;
                        request[i] = 0;
                        if(h[j].nome[0] == 0) break;
                        h[++j].nome = request+i+2;
                }
                if(primiduepunti && j>0 && request[i] == ':') {
                        primiduepunti = 0;
                        h[j].valore = request+i+1;
                        request[i] = 0;
                }
        }

        for(int i=1; i<j; i++) {
                printf("%s ---> %s \n", h[i].nome, h[i].valore);
        }
}
}

Спасибо за помощь!

1 Ответ

0 голосов
/ 14 мая 2018

Некоторая логическая проблема, смотрите:

while(1) {
  sin_size = sizeof(struct sockaddr_in);
  printf("qua");
  newS2 = accept(s,(struct sockaddr*)&local, &sin_size);
  printf("Accettata connessione con client \n");
  fflush(stdout);
  if(fork == 0) {
    if(newS2 == -1) {
      perror("Accept fallita");
      return 1;
    }
  }
}

Что бы ни случилось, вы возвращаетесь к accept или выходам, нет условия, которое позволяло бы вам выйти из цикла, чтобы что-то прочитать.return 1 просто возвращается из main и выходит из программы.

Примечание: я полагаю, fork - это вызов fork(), но даже в этом случае проблема та же ...

Примерно так должно быть лучше:

while(1) {
  sin_size = sizeof(struct sockaddr_in);
  newS2 = accept(s,(struct sockaddr*)&local, &sin_size);
  if(newS2 == -1) {
    perror("Accept fallita");
    return 1;
  }
  printf("Accettata connessione con client \n");
  fflush(stdout);
  if(fork() == 0) {
    break; // get out the loop...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...