我想實現一個簡單的文件傳輸。下面是我測試的兩種方法:發送文件在套接字編程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