誰在移動開發中用過IdTCPClient?ReadLn沒有問題,但是ReadBytes和ReadStream兩個函式都收取不完整。同樣的代碼不作任何改動,在Windows下運行很正常。不知道是不是Indy的Bug
//在執行緒中
while(!Terminated && MainForm->IdTCPClient1->Connected())
{
MainForm->IdTCPClient1->Socket->CheckForDataOnSource(100);
if(MainForm->IdTCPClient1->Socket->InputBufferIsEmpty() == false)
{
int nReceive = MainForm->IdTCPClient1->Socket->InputBuffer->Size;
char Buf[10240];
nReceive = Min(nReceive, sizeof(Buf));
TIdBytes tmp;
MainForm->IdTCPClient1->Socket->ReadBytes(tmp, nReceive); //讀資料
BytesToRaw(tmp, Buf, nReceive);
MainForm->fsUpdateFile->Write(Buf, nReceive); //寫入檔案
}
}
uj5u.com熱心網友回復:
一次收不全,就多次收唄,算什么buguj5u.com熱心網友回復:
不是一次,而是回圈無數次都收取不完整。uj5u.com熱心網友回復:
nReceive = MainForm->IdTCPClient1->Socket->InputBuffer->Size ==1024?是不是因為buf[1024],而nReceive>1024?
可不可以用
nReceive = Max(nReceive, sizeof(Buf));
IdTCPClient我沒用過,隨便亂說的。
uj5u.com熱心網友回復:
int nReceive = MainForm->IdTCPClient1->Socket->InputBuffer->Size;char Buf[10240];
nReceive = Min(nReceive, sizeof(Buf));
取最小值是因為分配的緩沖區是10240,如果超過個這大小,則先收取10240位元組,剩下的在下個回圈中繼續收取。
如果改為動態分配緩沖區大小,測驗的結果也是一樣,收不全服務器發送的內容:
int nReceive = MainForm->IdTCPClient1->Socket->InputBuffer->Size;
void *Buf = malloc(nReceive); //動態分配緩沖區
TIdBytes tmp;
MainForm->IdTCPClient1->Socket->ReadBytes(tmp, nReceive);
BytesToRaw(tmp, Buf, nReceive);
MainForm->fsUpdateFile->Write(Buf, nReceive);
free(Buf); //釋放
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/111517.html
標籤:網絡及通訊開發
下一篇:A*演算法完美解決八數碼問題
