2011-12-03 79 views
-6

我在從客戶端發送文件到服務器時遇到問題。當我發送文本文件時,它沒問題。但是,當我嘗試發送二進制文件時,我只收到文件的一部分或應用程序崩潰。我喜歡一些代碼,對於二進制轉換工作正常。我使用WinSock,我有SOCKET指向服務器,SOCKET指向客戶端。我已經嘗試了幾乎所有的東西,請幫助一下。
Thanx任何答覆。編輯: 我沒有任何資料來源。我需要幫助發送exe文件的變化比sendig txt中的變化。轉換?我打開它作爲bin,但它沒有幫助。編輯2: @thkala: 這是非常具體的。我想我做了所有3個可能的錯誤,我用getline()並終止在0字節,所以可能是這樣。如果不是getline(),要使用什麼?我打開任何liblary使用文件,我現在使用fstream。C++文件傳輸

+3

社區可以幫助您調試代碼(如果您提供的話)。如果你只是在尋找代碼搜索谷歌,你會發現很多。 – Boundless

+3

請張貼一些代碼,以便其他人可以提出修復建議。如果您有傳輸文本文件的代碼,那麼也許我們可以發現阻止您發送二進制文件的問題。 – dasblinkenlight

+0

嘗試在發送完所有內容後清空緩衝區。 – Kevin

回答

2

文本和二進制文件之間的一些差異顯著,可能會或可能不會發覺你:

  • 文本文件通常具有,通過行結束符分隔。對二進制文件使用面向行的函數可能會以各種有趣的方式失敗。

  • 作爲前一點的後續,有不保證二進制文件將永遠包含甚至單個行終止符。這種差異往往會破壞那些不知不覺地假定一行不能超過X個字符的代碼,然後在整個輸入之前繼續根據該假設分配內存。無論X有多大,總會有一個更大的文件。順便說一句,這樣的代碼通常也會在機器生成的文本文件中出現很長的行。

  • 通常假定文本文件不包含零字節,而二進制文件通常是這樣做的。由於零字節是C風格字符串的終止指示符,因此在通過面向文本的函數進行處理時,二進制內容往往會被破壞。即使各種函數的寬字符版本也會中斷,因爲它們只在特定位置期望零字節。

除非您發佈了一些代碼,否則不可能提供比此更具體的幫助。

0

使用fread(),ReadFile()或類似的函數從文件讀取數據塊到內存緩衝區,通過套接字緩衝區,然後根據需要重複,直到整個文件被讀取。如果您不介意使用特定於Microsoft的功能,則可以選擇使用CreateFile()打開該文件,然後使用TransmitFile()讓WinSock通過套接字將文件發送給您,這樣您就不必手動讀取該文件。