##// END OF EJS Templates
Se corrigió bug de funcion file2buffer. Faltaba '\0' al final de la cadena.
Se corrigió bug de funcion file2buffer. Faltaba '\0' al final de la cadena.

File last commit:

r25:26
r77:78
Show More
ABS_Client.c
283 lines | 7.6 KiB | text/x-c | CLexer
/*
* ABS_Client.c
*
* Fecha de creacion : Set, 2012
* Ultima modificacion : Oct 2012
* Autor : Christiane Dietrich.
*/
//#include <python2.6/Python.h>
#include <python2.5/Python.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include "./Librerias/Mensajes.h"
#define PUERTO_SERVIDOR 7000
//#define DIR_SERVIDOR "192.168.1.30"
/* Servidor */
#define TAM_BUFFER 10000
/* Servidor */
int ABS_Client(char *header, char *addrClient, char *addrServer ,char *opcion, char *valor_help){
int conexion_clienteFD;
struct sockaddr_in inf_servidor;
int broadcast= 1;
int resultado;
int numbytes_enviados;
long lSize=0;
size_t size_of_filecontent=0;
char *head= NULL;
char *tx= NULL;
char *rx= NULL;
char *comando= NULL;
char *data= NULL;
char *helper= ":";
char *tx_buff= NULL;
unsigned int indicator = 1;
head = (char*) malloc (sizeof(char)*(strlen(header)+1));
if (head == NULL) {
printf("Memory error");
return -1;
}
strcpy (head, header);
tx = (char*) malloc (sizeof(char)*(strlen(addrClient)+1));
if (tx == NULL) {
printf("Memory error");
return -1;
}
strcpy (tx, addrClient);
rx = (char*) malloc (sizeof(char)*(strlen(addrServer)+1));
if (rx == NULL) {
printf("Memory error");
return -1;
}
strcpy (rx, addrServer);
/* determine comand */
if(strcmp(opcion,"-f") == 0){
comando= "SNDF";
FILE * file_to_send= NULL;
file_to_send = fopen(valor_help, "r");
if (!file_to_send){
printf("The file provided for the Control Modules couldn't be opened!!!\n");
return -1;
}
else{
// obtain file size:
fseek (file_to_send, 0 , SEEK_END);
lSize = ftell (file_to_send);
rewind (file_to_send);
// allocate memory to contain the whole file:
data = (char*) malloc (sizeof(char)*(lSize+1));
if (data == NULL) {
printf("Memory error");
return -1;
}
// copy the file into the data:
size_of_filecontent = fread (data,1,lSize,file_to_send);
if (size_of_filecontent != lSize) {
printf ("Reading error");
return -1;
}
/* the whole file is now loaded in the memory data. */
// terminate
fclose (file_to_send);
}
}else if (strcmp(opcion,"-c") == 0){ // Se reconoce el comando que se esta enviando
comando= "CHGB";
data = (char*) malloc (sizeof(char)*(strlen(valor_help)+1));
//data = (char *) malloc(strlen(valor)+1);
if (data == NULL) {
printf("Memory error");
return -1;
}
strcpy (data, valor_help);
}else if(strcmp(opcion,"-a") == 0){
comando= "ANST";
data = (char*) malloc (sizeof(char)*(strlen(valor_help)+1));
//data = (char *) malloc(strlen(valor)+1);
if (data == NULL) {
printf("Memory error");
return -1;
}
strcpy (data, valor_help);
}else {
ERROR("OPCION INCORRECTA: {-c|-a|-f}");
return -1;
}
//complete tx frame
tx_buff= (char *) malloc(strlen(head)+1+strlen(tx)+1+strlen(rx)+1+strlen(comando)+1+strlen(data)+1);
// Se arma el buffer a ser enviado.
strcpy(tx_buff,head);
strcat(tx_buff,helper);
strcat(tx_buff,tx);
strcat(tx_buff,helper);
strcat(tx_buff,rx);
strcat(tx_buff,helper);
strcat(tx_buff,comando);
strcat(tx_buff,helper);
strcat(tx_buff,data);
strcat(tx_buff,helper);
/* Se establece el socket UDP */
conexion_clienteFD= socket(AF_INET,SOCK_DGRAM,0);
if (conexion_clienteFD == -1){
ERROR("No se pudo establecer el socket: socket()");
return -1;
}
/* Se establece el Broadcast con la funcion setsockpt() */
resultado= setsockopt(conexion_clienteFD, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));
if (resultado == -1){
ERROR("No se pudo establecer la opcion de Broadcast: setsockopt()");
return -1;
}
/* Se configura la estructura que contiene la informacion sobre el servidor: inf_servidor */
inf_servidor.sin_family= AF_INET;
inf_servidor.sin_port= htons(PUERTO_SERVIDOR);
inf_servidor.sin_addr.s_addr= inet_addr(addrServer);
memset(inf_servidor.sin_zero, '\0', sizeof(inf_servidor.sin_zero));
/* Se procede a enviar el buffer */
numbytes_enviados= sendto(conexion_clienteFD,tx_buff,strlen(tx_buff),0,(struct sockaddr *)&inf_servidor,sizeof(inf_servidor));
printf ("Frame was sent to Central Control Module with %s IP number\n",addrServer);
if(numbytes_enviados == -1){
ERROR("Error de envio de datos: sendto()");
return -1;
}
free (head);
free (tx);
free (rx);
free (data);
free(tx_buff);
close(conexion_clienteFD);
///*
// servidor
int conexion_servidorFd;
struct sockaddr_in inf_servidor2;
struct sockaddr_storage inf_cliente;
int resultado2;
int numbytes_recibidos;
char *headR;
char *txR;
char *rxR;
char *comandoR;
char *valorR;
FILE *file_to_wr;
char *rx_buff = (char *) malloc(TAM_BUFFER);
// size_t addr_len;
socklen_t addr_len;
memset(&inf_servidor2, 0, sizeof(inf_servidor2));
inf_servidor2.sin_family= AF_INET;
inf_servidor2.sin_port= htons(PUERTO_SERVIDOR);
inf_servidor2.sin_addr.s_addr= INADDR_ANY;
// Se establece el socket
conexion_servidorFd = socket(AF_INET,SOCK_DGRAM,0);
if (conexion_servidorFd == -1){
ERROR_FATAL("No se establecio correctamente el socket: socket() point1");
}
// Se asocia el socket a un puerto y una IP
resultado2 = bind(conexion_servidorFd,(struct sockaddr *)&inf_servidor2,sizeof(inf_servidor2));
if (resultado2== -1){
ERROR_FATAL("No se establecio correctamente el socket: bind() point2");
}
while(indicator == 1){
LOG_SERVIDOR("Waiting for the client...\n");
// Se espera hasta que un cliente se conecte
addr_len = sizeof(inf_cliente);
numbytes_recibidos = recvfrom(conexion_servidorFd, rx_buff, TAM_BUFFER-1, 0, (struct sockaddr *)&inf_cliente, &addr_len);
if (numbytes_recibidos == -1){
ERROR_FATAL("Error en la recepcion de datos: recvfrom()");
}
// Se procede a procesar los datos recibidos
rx_buff[numbytes_recibidos]= '\0';
// create a response-file
headR = strtok(rx_buff, ":");
txR = strtok(NULL, ":");
rxR = strtok(NULL, ":");
comandoR = strtok(NULL, ":");
valorR = strtok(NULL, ":");
if ((headR == NULL) || (txR == NULL) || (rxR == NULL) || (comandoR == NULL) || (valorR == NULL)){
ERROR("procesarPeticionClient: formato de mensaje incorrecto");
}else{
if(strcmp(comandoR,"SNDF") == 0){
file_to_wr = fopen("report.abs", "w+");
if (!file_to_wr){
printf("The file, in which the received data should be written, couldn't be opened!!!\n");
}else{
fprintf(file_to_wr, "%s", valorR);
}
fclose(file_to_wr);
printf("File content was successfully written in\"report.abs\"\n");
}else if(strcmp(comandoR,"CHGB") == 0){
file_to_wr = fopen("report.ver", "w+");
if (!file_to_wr){
printf("The file, in which the received data should be written, couldn't be opened!!!\n");
}else{
fprintf(file_to_wr, "%s", valorR);
}
fclose(file_to_wr);
printf("File content was successfully written in \"report.ver\"\n");
}else if(strcmp(comandoR,"ANST") == 0){
file_to_wr = fopen("report.net", "w+");
if (!file_to_wr){
printf("The file, in which the received data should be written, couldn't be opened!!!\n");
}else{
fprintf(file_to_wr, "%s", valorR);
}
fclose(file_to_wr);
printf("File content was successfully written in \"report.net\"\n");
}else{
ERROR("procesa_peticion_client: respuesta no reconocido");
}
}
indicator = 0;
// servidor
}
free (rx_buff);
//*/
return 0;
}