用Timer每間隔50ms客戶端向服務器發送資料,服務器判斷資料包長度后再進行操作,可是運行一段時間后客戶端的sendbuf就會回傳-1,WSAGetLastError()為10035,服務器接收到的資料包長度也不符合要求,是因為客戶端TClientSocket的緩沖區滿了嗎?可以改變緩沖區的大小嗎?謝謝!
uj5u.com熱心網友回復:
除非你發的資料超過了緩沖區的大小,貼你接收部分的代碼看看。uj5u.com熱心網友回復:
void __fastcall TServerForm::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
RevNum=Socket->ReceiveLength();
if(RevNum!=3600)
{ShowMessage("資料接收錯誤!");
}
Socket->ReceiveBuf(Buffer,3600);
if (startflag==1)
WriteToCB(); //寫入環形緩沖
CurvePlotThread->Resume(); //畫圖執行緒
}
uj5u.com熱心網友回復:
接收這部分看不出什么問題,檢查發送部分吧。不是接收快取的問題uj5u.com熱心網友回復:
發送部分是用定時器定時生成再發送的void __fastcall TClientForm::SendTimerTimer(TObject *Sender)
{
switch(CurrentLinkStatus)
{
case Break:
{
ShowMessage("與服務器連接出錯,請重新連接!");
SendTimer->Enabled=false;
break;
}
case Link:
{
RandomGenerate();
SendNum=ClientSocket->Socket->SendBuf(&RandomData,sizeof(RandomData));
if(SendNum!=3600)
{ SendErNum=WSAGetLastError();
ShowMessage("資料發送錯誤!發送位元組數為"+IntToStr(SendNum)+",錯誤代碼為"+IntToStr(SendErNum));
}
break;
}
}
}
uj5u.com熱心網友回復:
我看你是有專門的函式產生發送資料的,你用日志記錄一下發送的資料及長度,看看有沒有問題,再定位故障uj5u.com熱心網友回復:
發送一組資料完了,最好等待一下,太快了好像會有問題轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61506.html
標籤:網絡及通訊開發
下一篇:delete的奇怪現象
