сокеты — получено больше байтов, чем отправлено переполнение стека

Я хочу отправить файл с сервера Linux клиенту Windows через сокеты, проблема в том, что я получаю больше байтов, чем отправляю.

Код сервера ———————————————-

if (resultEnviarLongitud = send(ClientSocket,GotFileSize.c_str(),1024,0)<0){
cout<<endl<<"Error mandando la longitud! "<<endl;
}
rewind(fs);

while ((len = fread(Buffer,1,1024, fs)) > 0)
{
if((resultEnviar = send(ClientSocket,Buffer,1024,0)) < 0){
printf("ERROR: Failed to send file %s.\n", nombreArchivoADescargar.c_str());
break;
}
sumEnviada+=len;
}

send(ClientSocket,"Hi",sizeof(Buffer),0);cout<<"Bytes enviados: "<<sumEnviada<<endl;
strcpy(data, "");

cout<<endl<<"ARCHIVO MANDADO EXITOSAMENTE!"<<endl;
rutaArchivoADescargar.clear();

Код клиента ——————————————

if (resultRecibirLongitud = recv(sock, Buffer, sizeof(Buffer), 0) > 0)
{
LongitudArchivo = atoi(Buffer);
cout<<endl<<"Longitud Archivo a Recibir: " <<LongitudArchivo<<endl;
}

FILE *fp=fopen("imagen.jpg","wb");
if (fp==NULL){
cout<<"Error al crear archivo."<<endl;
}else{
bzero(Buffer2, 1024);
int fr_block_sz = 0;
int contador=0;

//shutdown(sock, SD_SEND); I HAVE TO USE IT?

while((fr_block_sz = recv(sock, Buffer2, 1024, 0)) >= 0)
{
if (fr_block_sz == 0) break;
if ( strcmp (Buffer,"Hi") == 0) break;
int write_sz = fwrite(Buffer2, 1, 1024, fp);
if(write_sz < fr_block_sz)
{
printf("File write failed on server.\n");
}
bzero(Buffer2, 1024);
contador+=fr_block_sz;
if (contador >= LongitudArchivo)break;
bzero(Buffer2, 1024);
}
cout<<endl<<"Numero de bytes recibidos: "<<contador<<endl<<endl;
if(fr_block_sz < 0)
{
printf("Error receiving file from client to server.\n");
}
printf("Ok received from client!\n");
fclose(fp);
}

Спасибо,

0

Решение

while ((len = fread(Buffer,1,1024, fs)) > 0)
{
if((resultEnviar = send(ClientSocket,Buffer,1024,0)) < 0)

Одна из ваших проблем заключается в том, что вы всегда отправляете 1024 байта буфера, даже если вы fread меньше байтов. (Обратите внимание, что 1348656, округленное до ближайшего кратного 1024, равно 1349632.)

Итак, на стороне записи вы хотите что-то вроде:

while ((len = fread(Buffer,1,1024, fs)) > 0)
{
if((resultEnviar = send(ClientSocket,Buffer,len,0)) < 0)

и на стороне чтения вы хотите что-то вроде:

while((fr_block_sz = recv(sock, Buffer2, 1024, 0)) >= 0)
{
// ...
int write_sz = fwrite(Buffer2, 1, fr_block_sz, fp);

Ваш начальный send также проблематично, так как вы всегда отправляете 1024 байта без проверки, что это фактическая длина того, что возвращается c_str,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]