【发布时间】:2015-06-16 20:07:32
【问题描述】:
我正在尝试实现一个简单的文件传输。下面是我一直在测试的两种方法:
方法一:发送和接收不拆分文件。 为了便于测试,我对文件大小进行了硬编码。
发件人:
send(sock,buffer,107,NULL); //sends a file with 107 size
接收者:
char * buffer = new char[107];
recv(sock_CONNECTION,buffer,107,0);
std::ofstream outfile (collector,std::ofstream::binary);
outfile.write (buffer,107);
输出与预期一致,文件没有损坏,因为我发送的.txt 文件包含与原始文件相同的内容。
方法二:在接收端拆分内容进行发送和接收。每个循环 5 个字节。
发件人:
send(sock,buffer,107,NULL);
接收者:
char * buffer = new char[107]; //total file buffer
char * ptr = new char[5]; //buffer
int var = 5;
int sizecpy = size; //orig size
while(size > var ){ //collect bytes
recv(sock_CONNECTION,ptr,5,0);
strcat(buffer,ptr); //concatenate
size= size-var; //decrease
std::cout<<"Transferring.."<<std::endl;
}
std::cout<<"did it reach here?"<<std::endl;
char*last = new char[size];
recv(sock_CONNECTION,last,2,0); //last two bytes
strcat(buffer,last);
std::ofstream outfile (collector,std::ofstream::binary);
outfile.write (buffer,107);
输出:文本文件包含无效字符,尤其是在开头和结尾处。
问题:我怎样才能使方法 2 起作用?大小相同,但产生不同的结果。方法2的原始文件和新文件的相似度约为98~99%,而方法1的相似度为100%。传输文件的最佳方法是什么?
【问题讨论】:
-
您的网络堆栈有望阻止您一次仅通过网络发送 5 个字节。赞美纳格尔!!
-
我使用了 5 个字节以便于测试(因为 .txt 文件的大小很小,并且内容很容易比较)并知道我的方法是否有效。如果是这样,那么我计划将其增加到喜欢 1024 或其他东西。
-
strcat可能会杀了你。您发送的内容不一定会以 NULL 结尾,因此strcat将不知道在哪里结束。 -
您忽略了
recv的返回值。它返回 实际 读取了多少字节 - 您总是假设读取了完整的 5 个字节,但情况不一定如此。只需确保使用recv的返回值而不是var。 -
您不能将
strcat()用于初始化缓冲区。它会在追加之前通过内存寻找空值。