Estoy intentando enviar archivos por sockets. Creé un programa y funciona para tipos de archivos como .cpp, .txt y otros archivos de texto. Pero los archivos binarios, las imágenes (.jpg, .png) y los archivos comprimidos como .zip y .rar no se envían correctamente. Sé que no tiene nada que ver con el tamaño de los archivos porque probé con archivos .txt grandes. No sé el problema, recibo todos los bytes que se envían pero el archivo no se puede abrir. La mayoría de las veces el archivo está dañado y no se puede ver. Busqué una solución en Google y encontré otras con el mismo problema y sin solución. Así que al ayudarme, también estás ayudando a cualquier otra persona que necesite una solución.Envío de imágenes a través de sockets de C++ (Linux)
código del servidor:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main (int agrc, char *argv[])
{
/******** Program Variable Define & Initialize **********/
int Main_Socket; // Main Socket For Server
int Communication_Socket; // Socket For Special Clients
int Status; // Status Of Function
struct sockaddr_in Server_Address; // Address Of Server
struct sockaddr_in Client_Address;// Address Of Client That Communicate with Server
int Port;
char Buff[100] = "";
Port = atoi(argv[2]);
printf ("Server Communicating By Using Port %d\n", Port);
/******** Create A Socket To Communicate With Server **********/
Main_Socket = socket (AF_INET, SOCK_STREAM, 0);
if (Main_Socket == -1)
{
printf ("Sorry System Can Not Create Socket!\n");
}
/******** Create A Address For Server To Communicate **********/
Server_Address.sin_family = AF_INET;
Server_Address.sin_port = htons(Port);
Server_Address.sin_addr.s_addr = inet_addr(argv[1]);
/******** Bind Address To Socket **********/
Status = bind (Main_Socket, (struct sockaddr*)&Server_Address, sizeof(Server_Address));
if (Status == -1)
{
printf ("Sorry System Can Not Bind Address to The Socket!\n");
}
/******** Listen To The Port to Any Connection **********/
listen (Main_Socket,12);
socklen_t Lenght = sizeof (Client_Address);
while (1)
{
Communication_Socket = accept (Main_Socket, (struct sockaddr*)&Client_Address, &Lenght);
if (!fork())
{
FILE *fp=fopen("recv.jpeg","w");
while(1)
{
char Buffer[2]="";
if (recv(Communication_Socket, Buffer, sizeof(Buffer), 0))
{
if (strcmp (Buffer,"Hi") == 0 )
{
break;
}
else
{
fwrite(Buffer,sizeof(Buffer),1, fp);
}
}
}
fclose(fp);
send(Communication_Socket, "ACK" ,3,0);
printf("ACK Send");
exit(0);
}
}
return 0;
}
Código Cliente:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main (int agrc, char *argv[])
{
int Socket;
struct sockaddr_in Server_Address;
Socket = socket (AF_INET, SOCK_STREAM, 0);
if (Socket == -1)
{
printf ("Can Not Create A Socket!");
}
int Port ;
Port = atoi(argv[2]);
Server_Address.sin_family = AF_INET;
Server_Address.sin_port = htons (Port);
Server_Address.sin_addr.s_addr = inet_addr(argv[1]);
if (Server_Address.sin_addr.s_addr == INADDR_NONE)
{
printf ("Bad Address!");
}
connect (Socket, (struct sockaddr *)&Server_Address, sizeof (Server_Address));
FILE *in = fopen("background.jpeg","r");
char Buffer[2] = "";
int len;
while ((len = fread(Buffer,sizeof(Buffer),1, in)) > 0)
{
send(Socket,Buffer,sizeof(Buffer),0);
}
send(Socket,"Hi",sizeof(Buffer),0);
char Buf[BUFSIZ];
recv(Socket, Buf, BUFSIZ, 0);
if (strcmp (Buf,"ACK") == 0 )
{
printf("Recive ACK\n");
}
close (Socket);
fclose(in);
return 0;
}
¿Es esto realmente específico de Linux? – Wizard79
@Lorenzo - Si no sabes cuál es el problema, ¿cómo sabrías por adelantado? Podrías preguntar razonablemente si está relacionado con C++. ¿Dónde trazamos la línea? – Duck
Sin embargo, no encuentro ninguna buena razón para decir que este es un problema específico de Linux. Es probable que esté presente en todos los sistemas que proporcionan una interfaz de socket. – Wizard79