我想实现一个简单的文件传输。下面是我测试的两种方法:发送文件在套接字编程tcp
方法一:发送和接收没有拆分文件。 我硬编码的文件大小,更容易测试。
发件人:
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%,而方法一中为100%。传输文件的最佳方法是什么?
您的网络堆栈希望阻止您一次只通过线路发送5个字节。赞美Nagle! –
我使用了5个字节进行更简单的测试(因为.txt文件尺寸较小,内容可以很容易比较),并知道我的方法是否可行。如果是这样,那么我打算增加它到1024或其他东西。 –
'strcat'可能正在杀死你。你发送的内容不一定是NULL终止的,所以'strcat'不知道在哪里结束。 – user4581301