2010-09-06 143 views
1

我已經創建了小套接字程序(客戶端/服務器)。客戶端將傳輸所有格式的文件到服務器。我現在面臨的問題是 - 我以二進制模式讀取mp3文件併發送到服務器。服務器從緩衝區中讀取內容並創建一個文件。但是當我試圖打開文件時,它並未打開。但尺寸與原來的一樣。任何人都可以指出我在做錯的地方。 這裏是我的服務器端代碼:在c編程的套接字編程

recv(newSocket,fileSize,50,0); //Receiving file size 

// buffer=malloc(atoi(fileSize)); 
    int i=0; 

    recv(newSocket,buffer,atoi(fileSize),0); 
    fwrite(buffer,1,atoi(fileSize),out); 

客戶端: FREAD(數據,1,lSize所,文件);

sprintf(temp,"%ld",lSize); 

    send(socketDes,temp,strlen(temp),0); 


    send(socketDes,data,strlen(data),0); 
+0

檢查返回值! recv,send,fread等都會返回一些東西。這件事非常重要。 – nos 2010-09-06 18:08:59

+0

我猜發送無法正常工作。嘗試int check = send();如果支票等於臨時顯示發送工作正常。如果你可以嘗試用一些軟件打開文件像Audacity – EsmaeelE 2017-05-15 18:33:41

回答

4

這可能是,從基於流的套接字讀取數據時,你沒有得到所有你認爲你得到的字節。然後你正在寫一個正確大小的文件,但只有文件的開頭纔會有任何有意義的數據。

如果您使用TCP(一種面向流的連接),當您從套接字讀入緩衝區(您可能使用的是字節/字符數組)時,您只會獲得所有可用的字節在通話時。讀取函數的調用將立即返回,但寫入數據的緩衝區只會部分滿。

爲了解決這個問題,你需要檢查從套接字中讀取的實際數量實際上(通常讀取調用將返回該數字),然後重複讀取套接字,直到獲得所需的所有字節。

更新

至於你的代碼,它肯定看起來像你只打一個電話,到recv(),不檢查,以確保整個文件轉移。你需要把它放在一個循環中,並不斷讀取數據,直到你已經讀取儘可能多的數據(在這裏是整個文件的大小)。

您可能還想在發送端解決此問題。即使您在send調用之間有睡眠命令,send也只會在每次調用時發送一定數量的數據。您需要將send放置在一個循環中,並在您發送了所有希望發送的數據之前繼續發送數據。

考慮以下(未經測試的僞)代碼recv

int numberOfReceivedBytes=0; 
while (numberOfReceivedBytes<fileSize){ 
    numberOfReceivedBytes+=recv(newSocket,buffer + numberOfReceivedBytes,sizeof(*buffer),0) 
} 

此外,它看起來當你閱讀從插槽中文件的大小一樣,你可能會得到意外的文件本身除了一部分文件的大小。確保您確切地知道有多少字節將指示文件的實際大小並只讀取那麼多字節。此外,atoi僅適用於數字的字符串(ASCII)表示形式。您的服務器正在接收實際的號碼。

要做到送:

int numberOfSentBytes=0; 
while (numberOfSentBytes<fileSize){ 
    numberOfSentBytes+=send(newSocket,buffer+numberOfSentBytes,fileSize-numberOfSentBytes+1,0); 
} 
+0

好的,謝謝你讓我試試,讓你知道 – Allwyn 2010-09-06 18:14:16

+0

你可以請讓我知道如何發送和recv循環參考我的代碼。因爲我一次性將整個文件內容讀入數據。我不知道如何拆分和發送。您可以在這方面請大家幫忙 – Allwyn 2010-09-06 18:24:23

+0

您通常可以一次讀取整個文件(儘管我不會指望這一點 - 您可能也希望將它放在循環中)。我編輯了我的答案,以顯示發送循環的示例。 – 2010-09-06 19:04:57

0

試圖打開文件後,如何使用MP3播放器之後,它已被傳輸?

也許你不是在「二進制」模式下編寫輸出文件;在某些操作系統上,這會導致字節被翻譯,如果它真的是二進制文件而不是文本,則會丟棄該文件。

如果你打開使用fopen()寫的文件,包括在第二個參數中"b"

FILE *out = fopen("incoming.mp3", "wb"); 
+0

這裏是我的代碼爲你的ref: – Allwyn 2010-09-06 17:57:50