首页 > 解决方案 > C服务器运行但没有输出

问题描述

关于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);
        }
}
}

感谢所有的帮助!

标签: cubuntuserver

解决方案


一些逻辑问题,看:

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

推荐阅读