Sto tentando di inviare file tramite socket. Ho creato un programma e funziona per tipi di file come .cpp, .txt e altri file di testo. Ma file binari, immagini (.jpg, .png) e file compressi come .zip e .rar non vengono inviati correttamente. So che non è qualcosa a che fare con la dimensione dei file perché ho provato con file .txt di grandi dimensioni. Non conosco il problema, sto ricevendo tutti i byte inviati ma il file non può essere aperto. La maggior parte delle volte il file è corrotto e non può essere visualizzato. Ho cercato tramite Google una soluzione e ho appena trovato altri con lo stesso problema e nessuna soluzione. Quindi, aiutandomi, stai anche aiutando chiunque altro abbia bisogno di una soluzione.Invio di immagini tramite socket C++ (Linux)
Codice Server:
#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;
}
Codice 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;
}
È veramente specifico di Linux? – Wizard79
@Lorenzo - Se non sai qual è il problema, come si dovrebbe sapere in anticipo? Si potrebbe ragionevolmente chiedere se è correlato al C++. Dove disegniamo la linea? – Duck
Tuttavia, non ho trovato alcun motivo valido per dire che questo è un problema specifico di Linux. È probabilmente presente su ogni sistema che fornisce un'interfaccia socket. – Wizard79