[英]Socket Programming in c
我創建了小型套接字程序(客戶端/服務器)。 客戶端將所有格式的文件傳輸到服務器。我現在面臨的問題是 - 我以二進制模式讀取mp3文件並發送到服務器。 服務器從緩沖區讀取內容並創建文件。但是當我嘗試打開文件時,它沒有打開。 但尺寸與原始尺寸相同。 任何人都可以指出我做錯了什么。 這是我的服務器端代碼:
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);
可能是,從基於流的套接字讀取時,您沒有獲得您認為正在獲得的所有字節。 然后,您正在編寫正確大小的文件,但只有文件的開頭才會有任何有意義的數據。
如果您正在使用TCP(面向流的連接),當您從套接字讀取到緩沖區(您可能正在使用byte / char數組)時,您將只獲得當時可用的所有字節。電話。 對read函數的調用將立即返回,但寫入數據的緩沖區將僅部分填滿。
要解決此問題,您需要檢查從套接字實際讀取的字節數(通常讀取調用將返回該數字),然后重復讀取套接字,直到您擁有所需的所有字節為止。
更新
關於你的代碼,看起來你只需要調用一次recv()
並且不檢查以確保整個文件被傳輸。 您需要將其置於一個循環中並連續讀取數據,直到您已經根據需要讀取(在這種情況下,整個文件的大小)。
您可能還想在發送方修復此問題。 即使在send
調用之間有sleep命令, 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);
}
嘗試打開文件后如何使用MP3播放器進行傳輸?
也許你不是在“二進制”模式下編寫輸出文件; 在某些操作系統上,這將導致翻譯字節,如果文件確實是二進制而不是文本,則會丟棄該文件。
如果您使用fopen()
要寫入的文件,請在第二個參數中包含"b"
:
FILE *out = fopen("incoming.mp3", "wb");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.