簡體   English   中英

為什么這個函數永遠循環?

[英]Why does this function loop forever?

我有這個函數,它接受一個SOCKET和一個文件名到輸出文件,然后它嘗試接收數據並將其輸出到一個文件,當編譯和運行代碼時它工作正常但程序不退出並且輸出文件( file.txt ) 包含一些不可讀的垃圾文本

其余代碼工作正常並經過測試,我確定問題出在此文件中,但不知道是什么以及在哪里


int recv_file(SOCKET soc, const char * fname)
{
    FILE * ptr; 
    char buffer[MAX];
    unsigned long long int x = 0; 
    if (fopen_s(&ptr, fname , "wb") != 0)
    {
        printf("Failed to receive file \n");
        return 1;
    }

    do
    {
        c = recv(soc, buffer, MAX, 0);
        printf("recv count : %d\n",c);
        // here was -> fwrite(buffer, 1, sizeof(buffer), ptr);
        fwrite(buffer, 1, c, ptr);
    }
    while ( c > 0);
    printf("Total received : %lld\n", x);

    fclose(ptr);
    return 0;
}

作為輸出,它只打印一行recv count : 65

我嘗試使用closesocket(soc);WSACleanup(); 但這並不能解決問題

對於服務器,我使用 netcat 和 python socketserver 進行了測試,兩者的行為相同

do-while之后的最后一個printf也不會打印到屏幕上

  1. 來自網絡的數據可以以大塊的形式出現
  2. recv對 break 處理的錯誤(停止循環)返回負值。
  3. recv返回接收到的字節數。
  4. fwrite應該寫入的字節數等於已經接收到的字節數,所以它應該是:
fwrite(buffer, 1, c, ptr);

在那里傳遞sizeof(buff)將在文件中記錄垃圾(內容來自先前讀取或內存垃圾)。

現在的問題是發送者在沒有數據時會做什么。 如果沒有, recv將阻塞等待新數據。 如果發送方關閉 tcp 連接,則recv應報告相應的錯誤並結束循環。

如果您從某個 HTTP 服務器獲取數據,那么服務器很可能會假定客戶端將關閉連接。 服務器只是等待下一個請求。

另請注意,根據SOCKET配置, recv可能會阻塞或不會阻塞。 因此,當實際上將來會有新數據時,取決於該recv可能會在成功時返回0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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