Socket + Scrittura su File

di il
1 risposte

Socket + Scrittura su File

Salve a tutti,
è il mio primo messaggio e confesso che non sono un mostro del C++ anzi...
mi son avvicinato alle socket per gestire su linux un'interfaccia seriale via remoto.
Ma partiamo per gradi il mio scopo è semplicemente inviando determinati comandi via remoto, scrivere su un file i valori "0" o "1".
ACCENDI -> 1
SPEGNI(o altro) -> 0
ho trovato un codice per le socket su internet che sto modificando:
/*
 * File: server.c
 * Autore: Iezzi Alessandro
 * Server d'esempio
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>

#define MAX 8192 /* in bytes, 8KB */

char buff[MAX]; /* dati di invio e ricezione */
struct sockaddr_in server_addr; /* indirizzo del server */
struct sockaddr_in client_addr; /* indirizzo del client */
int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
int i,j;
int main()
{
	FILE *pf;
	pf = fopen( "/home/marco/Scrivania/file.txt", "w" );
	char val[1];
	val[0]='0';
	i = fwrite( val, 1, 1, pf );

 
/*
 * Creazione socket descriptor per il server.
 * AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
 */
	if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		printf("Errore nella creazione del server\n");
 
/*
 * Inseriamo nella struttura alcune informazioni
 */
	server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
	server_addr.sin_port = htons(1745); /* la porta in ascolto */
	server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server bisogna associargli l'indirizzo della macchina su cui sta girando */
 
/*
 * Assegnazione del processo alla socket tramite la funzione BIND
 */
	if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
		printf("Errore di binding\n");

/*
 * Si mette in ascolto con un massimo di 20 connessioni
 */
	listen (sd_server, 20);
 
/*forum cè+
 * Essendo un server monothreading, accetterà una sola connessione per volta
 */
	int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */
/* Con opportune modifiche si potrebbe vedere anche l'ip del client */
	if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
		printf("Errore nella chiamata accept\n");
/* si ricevono i dati dal client */
	recv(sd_client, buff, sizeof(buff), 0);
	printf("Dati ricevuti: %s\n", buff);
	if(strcmp(buff,"ACCENDI")==0){
		printf("ACCENSIONE...\n");
		val[0]='1';
		i = fwrite(val, 1, 1, pf );}
	else{
		val[0]='0';
		i = fwrite(val, 1, 1, pf );
	}
/* Decommentare queste due righe per visualizzare l'indirizzo ip del client */
	/*char *ip_address = inet_ntoa(client_addr.sin_addr);
	printf("<acronym title="Internet Protocol">IP</acronym> del client: %s\n", ip_address);*/
/* si spedisce un messaggio */
	strcpy(buff, "Tutto OK!");
	send(sd_client, buff, strlen(buff), 0);
	for(j=0; j<20; j++)
		buff[j]='\0';

/* chiusura del socket descriptor */
	close(sd_client);
	close(sd_server);
 
	return 0;
}
 */
il problema è che non viene eseguita alcuna scrittura sul file (nemmeno quella ad inizio main) finché nel codice è presente questa riga
if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
se la commento (ovviamente non funziona più la socket ma il programma scrive sul file) boh mistero...
in ogni caso il codice del client è il seguente:
/*
 * File: client.c
 * Autore: Iezzi Alessandro
 * Client d'esempio
 */
#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 */
 
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 */
 
/* Utilizzando la struttura hostent si definisce l'indirizzo del server */
	struct hostent *hp;
	hp = gethostbyname("79.32.199.142");
 
	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");
 
/* Si inviano alcuni dati */
	send(sd, "DDDati inviati dal client", strlen("DDDDati inviati dal client"), 0);
 
/* Si riceve la risposta */
	recv(sd, buff, sizeof(buff), 0);
	printf("Risposta del server: %s\n", buff);
	close(sd);
	return EXIT_SUCCESS;
}
Speriamo riusciate ad aiutarmi.
Grazie a tutti.
Marco

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte