[RISOLTO] [C] gestire le socket con i processi

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Giupardeb
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2227
Iscrizione: venerdì 3 novembre 2006, 14:42

[RISOLTO] [C] gestire le socket con i processi

Messaggio da Giupardeb »

Buona sera a tutti ragazzi, questo è il mio problema:

Ho un client che ogni tot di secondi invia informazioni ad un server..ma contemporaneamente deve stare in ascolto su una socket per poter stampare le informazioni che il server invia. Questo è il codice:

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
 
#define MAX 8192 /* in bytes, 8KB */
#define SERVER_IP "192.168.1.3"

 
int main() {
	int sd; /* Il socket descriptor del client */
	struct sockaddr_in server_addr; /* l'indirizzo del server */
	char buff[MAX]; /* dati di invio e ricezione */
  pid_t pid;
 
/* Utilizzando la struttura hostent si definisce l'indirizzo del server */
	struct hostent *hp;
	hp = gethostbyname(SERVER_IP);
 
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(1745);
/* successivamente viene memorizzato nella struttura server_addr */
	server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) -> s_addr;
 
/* Viene creato il socket descriptor */
	if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		printf("Errore nella creazione della socket\n");
/* Viene connesso al server */
  if(connect(sd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    printf("Errore di connessione al server\n");
  
  pid = fork();
  
  while(1){
    
      if(pid == 0){ /*figlio*/
        /* Si inviano alcuni dati */
        for(int i=0;i<10;i++){
        	send(sd, "Dati inviati dal client", strlen("Dati inviati dal client"), 0);
        }
      }
      else if(pid > 0){
      /* Si riceve la risposta */
        while(1){
          recv(sd, buff, sizeof(buff), 0);
          if(strlen(buff) != 0){
            printf("Risposta del server: %s\n", buff);
            memset(buff,'\0',MAX);
          }
        }
      } else {
          printf("ERRORE CREARE FIGLIO\n");
          exit(-1);
       }
  }
  close(sd);
	return EXIT_SUCCESS;
}


in pratica il server riceve solo una volta l'informazione del client mentre il client non riceve nulla dal server
è la prima volta che mi cimento nell'uso dei processi in C, quindi non riesco a capire cosa e dove sbaglio. Potete aiutarmi?

Grazie mille anticipatamente e buona serata :ciao:
Ultima modifica di Giupardeb il lunedì 3 ottobre 2016, 15:31, modificato 1 volta in totale.
Il Saggio coltiva Linux, tanto Windows si pianta da solo...
E Dio creò il Programmatore, e lo mise nel Centro Dati; e Dio mostrò al Programmatore l'Albero dei volumi e algoritmi cifrati e disse - Puoi usare tutti i volumi e sottovolumi, MA NON USARE MAI COME O.S Windows.
Gianluca912
Prode Principiante
Messaggi: 135
Iscrizione: giovedì 20 dicembre 2012, 18:35
Desktop: XFCE
Distribuzione: Xubuntu 18.04 (x64)
Sesso: Maschile

Re: [C] gestire le socket con i processi

Messaggio da Gianluca912 »

Il figlio invia dati una sola volta al server perchè termina dopo aver concluso il ciclo (quindi diventa un processo zombie), mentre il padre rimane in loop nel while in attesa della risposta dal server, il mio suggerimento è quello di far terminare il padre e di lasciare il processo figlio in ascolto sulla socket. Non ho mai usato la fork per creare programmi di rete quindi non sono sicuro di quello che ti dico ma un problema potrebbe essere dovuto al buffer la cui soluzione sarebbe fflush().

Non dimenticando comunque che sul server ci deve essere un processo che risponda.. (scontato)
Hello :)
Avatar utente
Giupardeb
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2227
Iscrizione: venerdì 3 novembre 2006, 14:42

Re: [C] gestire le socket con i processi

Messaggio da Giupardeb »

sono stato un stupido..il client funzionava bene..ma il server appena rispondeva la prima volta chiudeva il socket e non riceveva (giustamente) più nulla..Grazie mille per l'interesse :)
Il Saggio coltiva Linux, tanto Windows si pianta da solo...
E Dio creò il Programmatore, e lo mise nel Centro Dati; e Dio mostrò al Programmatore l'Albero dei volumi e algoritmi cifrati e disse - Puoi usare tutti i volumi e sottovolumi, MA NON USARE MAI COME O.S Windows.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 12 ospiti