套接字不发送所有二进制数据

时间:2010-12-28 23:12:40

标签: c++ sockets ftp winsock

其实我正在研究非常简单的FTP服务器。 现在我遇到发送文件的问题(FTP协议中的RETR)。我在我的客户端使用套接字和二进制模式。带文本的文件发送完美,但问题是二进制文件(图像等)。

这是我的代码:

FILE *fin=fopen(fileloc,"rb");

if(fin != NULL){
    fpos_t filelen;

    fseek (fin, 0, SEEK_END);
    fgetpos (fin, &filelen);

    fseek (fin, 0, SEEK_SET);
    printf("Sending file %s (%d b)", fileloc, filelen);
    sprintf(sbuffer,"150 Opening BINARY mode data connection for file transfer.\r\n");
    bytes = send(ns, sbuffer, strlen(sbuffer), 0);
    byte temp_buffer[512];

    long int totalsent;
    totalsent = 0;

    while (!feof(fin)){

        memset(temp_buffer, '\0', sizeof(sbuffer));

        fgets((char *)temp_buffer, sizeof(sbuffer), fin);

        if (!active) bytes = send(ns_data, (char *)temp_buffer, strlen(sbuffer), 0);
        else bytes = send(s_data_act, (char *)temp_buffer, strlen(sbuffer), 0);

        totalsent = totalsent + bytes;

        printf("     file size = %d, send = %d bytes, strlen = %d, total = %d, left = %d\n",
               filelen, bytes, strlen(sbuffer), totalsent, filelen-totalsent);
        }

    fclose(fin);
    sprintf(sbuffer,"250 File transfer completed... \r\n");
    bytes = send(ns, sbuffer, strlen(sbuffer), 0);
}

我的FTP客户端正在获取内部存在差异的不完整文件(我打开带有记事本的文件进行比较),正如您在此屏幕图像上看到的那样,如果URL无需登录即可显示:

http://i53.tinypic.com/2wcjtdk.jpg

文件大小也有差异 - 原始文件大约为7kB,发送副本大约少1kB。我使用了很多不同的FTP客户端,也存在同样的问题。

1 个答案:

答案 0 :(得分:5)

在您的发送调用中,您使用的是strlen,它可能适用于文本数据但不适用于二进制数据。当你从文件中读取时,你需要使用像read之类的调用来告诉你实际读取了多少字节,这样你就可以在发送调用中发送那么多字节。