PDA

Visualizza la versione completa : [Linguaggio C] Socket ricorsivi con contatore sul server


Carlo1983
13-01-2015, 11:34
Buongiorno. Volevo chiedervi aiuto con un banalissimo problema sui socket c.
Sono alle prime armi con la materia e ho iniziato da poco ma riesco a mandare messaggi di benvenuto da server a client con i socket.
Ora il mio problema è che con un server strutturato in maniera ricorsiva che fa quindi uso di fork() vorrei utilizzara un contatore di connessioni al server che però visualizzerà il client.
In pratica al posto del messaggio di benvenuto il server invia il valore del contatore.
Il problema credo sia dato dal fatto che la fork() caricando ad ogni invocazione un'immagine nuova del programma, ad ogni invocazione resetta il contatore e quindi passa al client sempre lo stesso valore.
Inoltre neanche sul server così strutturato riesco a visualizzare il contatore poichè il valore che visualizza è sempre incorretto e varia in base a dove piazzo il contatore.

Se volete posto il codice.
Spero mi aiuterete.
Grazie.

Carlo1983
14-01-2015, 11:43
RISOLTO.

Ad imperitura memoria posto il codice del client e del server.
L'import basic.h naturalmente raccoglie tutti gli import e definisce macro come BACKLOG (che ha valore 5) quindi una volta copiate questi codici andranno aggiunti a mano gli include necessari.

client.c

/*
* Numerato_client.c
*
* Created on: 12/gen/2015
* Author: Carlo1983
*/

#include "basic.h"

void messaggio(int);

int main(int argc, char *argv[]) {

int connsock;
struct sockaddr_in servsock;
socklen_t socklen;

if (argc != 3) {
printf(
"Utilizzo del programma \"Numerato_client\" <#indirizzo> <#porta>\n");
return 0;
}

//Popolo la struttura server:
bzero(&servsock, sizeof(struct sockaddr));
servsock.sin_family = AF_INET;
servsock.sin_port = htons(atoi(argv[2]));
socklen = sizeof(struct sockaddr);

//Converto l'indirizzo passato dal client in indirizzo in formato web:
if (inet_pton(AF_INET, argv[1], &servsock.sin_addr) != 1) {
printf("Errore nella funzione INET_PTON()!\n");
exit(-1);
}

if ((connsock = socket(AF_INET, SOCK_STREAM, 0)) <= 0) {
printf("Errore nella funzione SOCKET()!\n");
exit(-1);
}

if (connect(connsock, (struct sockaddr *) &servsock, socklen) != 0) {
printf("Errore nella funzione CONNECT()!\n");
exit(-1);
}

messaggio(connsock);

return 0;
}

void messaggio(int connsock) {

char mess[MAXLINE];

bzero(&mess, sizeof(mess));


/*
QUI LA VOSTRA FUNZIONE PER RICEVERE L'INTERO DAL SOCKET
*/


printf("Io sono il server %s\n", &mess);
if (close(connsock) != 0) {
printf("Errore nella funzione CLOSE()!\n");
exit(-1);
}

}
//FINE CLIENT//


server.c

/*
* Numerato_server.c
*
* Created on: 12/gen/2015
* Author: carlo
*/


#include "basic.h"

void numera(int, int);

int main(int argc, char *argv[]){

int listfd, connfd, pid, i = '0';
socklen_t socklen;
struct sockaddr_in clisock, sersock;

//Popolo la struttura sockaddr:
bzero(&sersock, sizeof(sersock));
sersock.sin_family = AF_INET;
sersock.sin_addr.s_addr = INADDR_ANY;
sersock.sin_port = htons(atoi(argv[1]));
socklen = sizeof(struct sockaddr);

if(argc != 2){
printf("Utilizzo del programma:\n\tserver <#porta>\n");
return 0;
}

if((listfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0){
printf("Errore nella funzione SOCKET()!\n");
exit(-1);
}

if(bind(listfd, (struct sockaddr *) &sersock, socklen) != 0){
printf("Errore nella funzione BIND()!\n");
exit(-1);
}

if(listen(listfd, BACKLOG) != 0){
printf("Errore nella funzione LISTEN()!\n");
exit(-1);
}

for(;;){

if((connfd = accept(listfd, (struct sockaddr *) &clisock, &socklen)) <= 0){
printf("Errore nella funzione ACCEPT()!\n");
exit(-1);
}

i = i + 1; //QUI i VALE 1
printf("%c\n", i);

if((pid = fork()) == 0){ //FIGLIO
if(close(listfd) != 0){ //Senza il contatore sballa!
printf("Errore nella funzione CLOSE(listfd)!\n");
exit(-1);
}
numera(connfd, i);
if(close(connfd) != 0){
printf("Errore nella funzione CLOSE(connfd)!\n");
exit(-1);
}
return 0;
}

else if(pid > 0){ //PADRE
if(close(connfd) != 0){
printf("Problema nella funzione CLOSE() del padre!\n");
exit(-1);
}
}

else{
printf("Errore nella funzione FORK()!\n");
exit(-1);
}

}

return 0;
}

void numera(int connfd, int n){

/*
QUI LA FUNZIONE CHE SCRIVE L'INTERO SUL SOCKET
*/

printf("La fork() contiene %c\n", n);
bzero(&n, sizeof(n));

}
//FINE SERVER//


Spero possa essere d'aiuto.
Alla prossima.

Loading