2012-04-27 54 views
2

當我的客戶端向服務器發送一個文件時,我應該在發送下一個塊之前休眠(100)左右,以確保服務器有足夠的時間下載並寫入數據?文件傳輸C++

這似乎完全沒有必要嗎?

另外我發送一個塊時會發生blockblock錯誤(#10035),所以我只是循環發送,直到它成功,如果發送== SOCKET_ERROR goto SendAgain; , 這可以嗎?

+3

如果你正在使用的塊錯誤是循環,你爲什麼要擺在首位使用非阻塞套接字在做什麼? – Sven 2012-04-27 10:02:16

+0

閱讀關於Select – user1348950 2012-04-27 11:15:23

+0

的最新評論如果套接字不處於非阻塞模式,那麼'send'不應該返回一個封鎖錯誤,它應該在這種情況下阻塞。 – Sven 2012-04-27 13:16:52

回答

2

如果你通過TCP發送你的文件,那麼它是確保所有東西都被接收到的協議,我不會在每個塊之間進行睡眠。

willblock錯誤是您要爲輸出緩衝區發送太多數據,或者您嘗試發送太快,並且遠程緩衝區已滿。這似乎可以再次發送,因爲接收器收到它,但沒有足夠的空間來存儲它,並有理由放棄它。

這裏是你的錯誤的小文章:Winsock error 10035

+0

所以,如果這是任何原因,循環發送工作正常嗎?如何在本地一切都很好,但遠程似乎我會放下一些數據 – user1348950 2012-04-27 10:48:45

+0

如果緩衝區已滿並且有些數據被丟棄,您可能無法以正確的順序接收數據。您可以在發送實際文件之前添加您發送的文件的校驗和(SHA-1/MD5/...)。最後你可以確定收到了正確的整個文件。 – Uflex 2012-04-27 10:58:26

+0

我知道我正在丟失數據,因爲文件大小比較小,圖標不存在,文件無法打開等。我該如何防止數據被丟棄? – user1348950 2012-04-27 11:14:37

2

在使用sleepfunction等待事情做了我的意見是在99%的時間出現在錯誤的方式。 你現在從來沒有時間你需要或者你期望一個進程被執行(可以被例如尖峯,I/O或其他問題打斷)

如果你想確定一些重要的東西完全執行你應該閱讀關於信號量或類似的東西,在開始/結束時鎖定/釋放進程。

+0

我會研究一下,我想找一個睡眠替代品,謝謝。 – user1348950 2012-04-27 10:42:44

+0

不客氣。如果您想了解更多關於這種流程處理的知識,那麼優先級調度的主題應該引起您的興趣。 – 2012-04-27 11:58:11

0

man-page摘自:

When the message does not fit into the send buffer of the socket, send() normally blocks, unless the socket has been placed in nonblocking I/O mode. In nonblocking mode it would fail with the error EAGAIN or EWOULDBLOCK in this case. The select(2) call may be used to determine when it is possible to send more data.