【问题标题】:Receiving more bytes than sent C++接收的字节多于发送的 C++
【发布时间】:2013-11-21 10:12:44
【问题描述】:

我想通过套接字将文件从 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); 
}

谢谢,

【问题讨论】:

  • 您发送了什么,收到了什么?
  • 我发送一个 1348656 字节的图像,我收到 1349632 字节如果我使用“shutdown(sock, SD_SEND);”该图像看起来像服务器文件,但它的大小更大。如果我不使用“shutdown(sock, SD_SEND);”图像似乎已损坏。
  • 哈哈哈...回答我。
  • 注意,您应该使用shutdown来确保实际接收到发送的字节。 Shutdown(send) 仅在收到所有字节后才成功返回。发送/关闭不保证。

标签: c++ sockets send shutdown recv


【解决方案1】:
while ((len = fread(Buffer,1,1024, fs)) > 0)
{
    if((resultEnviar = send(ClientSocket,Buffer,1024,0)) < 0)

您的问题之一是即使您fread 更少的字节,您也总是发送 1024 字节的缓冲区。 (注意 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 返回的实际长度。

【讨论】:

  • 知道如何检查缓冲区的长度吗?因为如果我做 sizeof(Buffer) 它返回我 1024...
  • @user2824788:这与缓冲区的长度无关,重要的是读取的字节数,并且您已经将其存储在 len 中。
  • 但我不能发送 'len' 字节,因为接收者不知道 'len'。我一直在考虑,一旦文件被下载,计算“垃圾”字节的数量并删除它们。你怎么看?
  • @user2824788:接收方可以从recv 的返回值中检查它收到的(发送方发送的)字节数,但前提是您将正确的值传递给send from发送方。
  • 感谢您的耐心等待!
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
相关资源
最近更新 更多