簡體   English   中英

c中的套接字編程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM