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