gpt4 book ai didi

C Server运行但无输出

转载 作者:行者123 更新时间:2023-11-30 16:32:03 25 4
gpt4 key购买 nike

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

感谢您的帮助!

最佳答案

一些逻辑问题,请看:

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

关于C Server运行但无输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50324988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com