【问题标题】:C Server run but no outputC服务器运行但没有输出
【发布时间】:2018-05-14 07:24:55
【问题描述】:

关于 SO 的第一个问题。不是英语本地人,所以可能会犯一些错误,而且我的 cmets 是意大利语的。 目前我的 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);
        }
}
}

感谢大家的帮助!

【问题讨论】:

  • 这是什么newS = read(...
  • 这是学习如何使用调试器的绝佳机会。

标签: c ubuntu server


【解决方案1】:

一些逻辑问题,看:

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

【讨论】:

  • 试过了,但并没有真正改变任何东西。即使是我放置在 main() 开头的 printf,仍然运行而不会输出任何内容。感谢znyway的早日回复
  • @Marco 还有很多其他问题(news2 被共享和重用...)
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2021-11-04
  • 2017-01-21
  • 2020-03-14
相关资源
最近更新 更多