#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);
}
}
}
感谢您的帮助!
答案 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...
}
}