C Server运行但没有输出

时间:2018-05-14 07:24:56

标签: c ubuntu server

第一个问题是关于SO的问题。不是英国本土人,所以可能会犯一些错误,我的意见是意大利语。 目前我的C服务器实现有问题。代码运行没有错误,但是当我执行它时,它只显示没有。我试图打破代码并将一些打印件放到显示“阻塞”的位置,但无法得出结论。这是代码:

#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 :(得分:0)

一些逻辑问题,看:

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...
  }
}