Hola buenas, estoy trabajando en el envío de imágenes entre una FPGA y un PC. Me han recomendado el uso del protocolo LwIP pero al final me he decantado por hacerlo en UNIX normal. Hace tiempo hice un socket con para pasar datos (cabecera + payload) y no tuve ningún problema pero las imágenes se me están resistiendo. Compila sin errores pero no hace lo que tiene que hacer, recibe o tamaño de datos negativos o 0 y a partir de ahí no hace más (lógicamente).
Este es el código que uso en el cliente (Que tiene que recibir que las imágenes):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdint.h>
struct image {
int size;
char p_array[500000];
};
void main () {
struct image img;
int sock, addrlen; //Definir variables Socket
sock = socket(AF_INET,SOCK_STREAM,0); // Definimos sock como socket
if(sock < 0) {
perror("Error creating the socket"); // Comprobar que la funcion socket no es erronea
}
struct sockaddr_in their_addr; //Variable their_addr del tipo struct sockaddr
their_addr.sin_family = AF_INET; //Definimos valores a la struct sockaddr_in
their_addr.sin_port = htons (1990); // Lo asigna al puerto 1234
their_addr.sin_addr.s_addr = inet_addr ("192.168.0.6"); //Para que use cualquier IP valida para la máquina
addrlen = sizeof (struct sockaddr);
int conectar;
conectar = connect (sock, (struct sockaddr *)&their_addr, addrlen);
if (conectar<0) {
printf("Error al conectar\n");
}
//Logica de aplicacion
//Leer tamaño de imagen
printf("Reading Picture Size\n");
recv(sock, &img, sizeof(img),0);
printf("Recibido tamano: %d\n", img.size);
//Read Picture Byte Array
printf("Reading Picture Byte Array\n");
read(sock, img.p_array, img.size);
printf("Leido tamano\n");
//Convert it Back into Picture
printf("Converting Byte Array to Picture\n");
FILE *image;
image = fopen("c1.jpg", "w");
fwrite(img.p_array, 1, sizeof(img.p_array), image);
fclose(image);
}
Y este sería el servidor (que es el que tiene que enviar las imágenes):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define ALTO 480
#define ANCHO 640
#define PIXEL 4
#define OFFSET 0x0e000000
struct image{
int size;
char send_buffer[500000];
};
int main () {
int sock,new_sock, addrlen,backlog,cerrar, pkt_rx;
int leidos = 0;
int enviados = 0;
int DimImagen= ALTO*ANCHO*PIXEL; //tamaño de la imagen
char buffer[DimImagen];
struct image img;
backlog = 1;
sock = socket(PF_INET,SOCK_STREAM,0); // Definimos sock como socket, PF_INET = dominio donde se realiza la conexion, SOCK_STREAM = tipo de socket q se va a crear.
if(sock < 0) {
perror("Error creating the socket"); // Comprobar que la funcion socket no es erronea
}
struct sockaddr_in my_addr; //Variable my_addr de tipo stuct sockaddr
struct sockaddr_in their_addr; //Variable their_addr del tipo struct sockaddr
my_addr.sin_family = PF_INET; //Definimos valores a la struct sockaddr_in
my_addr.sin_port = htons (1990); // Lo asigna al puerto 1234
my_addr.sin_addr.s_addr = htonl (INADDR_ANY); //Para que use cualquier IP valida para la máquina
addrlen = sizeof(struct sockaddr);
if (bind(sock, (struct sockaddr *)&my_addr,addrlen) <0) { //Función BIN sirve para asociar estos parámetros.
perror("Error bind"); //Comprobamos si la funcion bind es correcta
}
if (listen(sock, backlog) == -1)
{
perror("Error listen"); //Comprobamos si la funcion listen es correcta
}
for(;;){
new_sock = accept (sock, (struct sockaddr *)&their_addr, &addrlen);
printf("Estoy conectado\n");
//Get Picture Size
printf("Getting Picture Size\n");
FILE *picture;
picture = fopen("/home/diego/Desktop/gato.jpg", "r");
//int size;
fseek(picture, 0, SEEK_END);
img.size = ftell(picture);
printf("tamano imagen: %i\n",img.size);
fseek(picture, 0, SEEK_SET);
//conv = htonl(size);
//Send Picture Size
printf("Sending Picture Size: %d conv: \n", img.size);
send(sock, &img, sizeof(img), 0);
printf("archivo enviado\n");
//Send Picture as Byte Array
printf("Sending Picture as Byte Array\n");
//char send_buffer[size];
while(!feof(picture)) {
fread(img.send_buffer, 1, sizeof(img.send_buffer), picture);
send(sock, &img, sizeof(img),0);
bzero(img.send_buffer, sizeof(img.send_buffer));
}
}
printf("Envio completo\n");
// recv(new_sock, &cerrar, sizeof(cerrar), 0);
close(new_sock);
close(sock);
}
La verdad es que me gustaría coger las imágenes dinámicamente de memoria (pues vienen grabadas de una cámara y almacenadas) pero con conseguir que funcione de este modo podría ir tirando. No soy un programador profesional (como podeis comprobar XD) pero si tengo muchas ganas de mejorar y de ir aprendiendo en este campo. Acepto toda crítica y busco una solución auqí porque por más que lo miro no acabo de alcanzar a ver el fallos .Muchas gracias de antemano por vuestra atención!