[英]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
也不會打印到屏幕上
recv
對 break 處理的錯誤(停止循環)返回負值。recv
返回接收到的字節數。fwrite
應該寫入的字節數等於已經接收到的字節數,所以它應該是:fwrite(buffer, 1, c, ptr);
在那里傳遞sizeof(buff)
將在文件中記錄垃圾(內容來自先前讀取或內存垃圾)。
現在的問題是發送者在沒有數據時會做什么。 如果沒有, recv
將阻塞等待新數據。 如果發送方關閉 tcp 連接,則recv
應報告相應的錯誤並結束循環。
如果您從某個 HTTP 服務器獲取數據,那么服務器很可能會假定客戶端將關閉連接。 服務器只是等待下一個請求。
另請注意,根據SOCKET
配置, recv
可能會阻塞或不會阻塞。 因此,當實際上將來會有新數據時,取決於該recv
可能會在成功時返回0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.