我試圖降低對發送緩衝區的大小我非阻塞TCP套接字,這樣我可以正確顯示上傳進度條,但我看到一些奇怪的行爲。奇怪的行爲
我創建嵌非阻塞TCP,SO_SNDBUF設置爲1024,驗證是正確設置,然後連接(在此之前試過和呼叫後沒什麼區別連接)。
問題是,當我的應用程序實際出現並調用發送(發送約2MB)而不是返回大約發送1024字節時,發送調用顯然接受所有數據並返回2 MB的發送值我通過的)。一切正常運行(這是一個HTTP PUT,我得到一個響應等),但我最終顯示在我的進度條是上傳坐在100%約30秒,然後響應進來。
我有證實,如果我在獲得響應之前停止,上傳並沒有完成,所以它不像它上傳得非常快,然後服務器停滯......任何想法?窗戶甚至看這個設置?
SO_SNDBUF是您的發送緩衝區的最大尺寸......試圖用1 kB緩衝區一次發送2MB,聽起來有點奇怪。你應該增加你的發送緩衝區大於2MB或者發送小於1kb。我認爲你錯誤地認爲設置SO_SNDBUF會在1 kB段中「剪切」你的2 MB並逐個發送它們,你需要自己做。 – 2011-03-15 14:40:02
我的印象是,它應該限制可以隨時排隊的數據量,但是,對。基本上,我只需要一個指標,表明實際傳輸了多少數據(而不是排隊)。緩衝區的大小並不是真的與我有關,我只是想挑選一些足夠小的內容,以便看到一些細節。有一個更好的方法嗎? HTTP沒有任何內置的中間上傳ACK afaik。 – Ogapo 2011-03-15 14:54:12
是的,就是這樣。如果您只能排隊1KB,則不能發送2MB。爲什麼它假裝它發送2 MB是另一個問題。請記住,無論你做什麼,TCP可能很好地將你的數據包組合或分割(見Nagle)。你應該分開你自己的發送,我想你的情況應該是10到50kB。要查看正在進行的上傳,請使用Wireshark或Fiddler2之類的代理。 – 2011-03-15 15:10:44