CBuilder6.0采用NMUDP控制元件寫UDP發送程式,最多只能發送8K的資料,求高手指導。貼代碼如下:
//發送資料
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(Edit1->Text == "")
{
ShowMessage("請選擇一個檔案進行傳送!");
return;
}
if(Edit2->Text == ""||Edit3->Text == "")
{
ShowMessage("請正確填寫遠程主機IP和埠號");
return;
}
NMUDP1->RemoteHost = Edit2->Text;
NMUDP1->RemotePort = StrToInt(Edit3->Text);
NMUDP1->ReportLevel = Status_Basic;
Memo2->Clear();
//載入檔案流
TFileStream *Strm = new TFileStream(Edit1->Text,fmOpenRead);
const int bufLength = 2048;
char *Buffer = new char[bufLength];
int BuffSize = Strm->Size;
int Buf = BuffSize/bufLength;
for(int i=0;i<Buf+1;i++)
{
if(BuffSize>bufLength)
{
Strm->Read(Buffer,bufLength);
NMUDP1->SendBuffer(Buffer,bufLength,bufLength);
}
else
{
Strm->Read(Buffer,BuffSize);
NMUDP1->SendBuffer(Buffer,BuffSize,BuffSize);
}
BuffSize=BuffSize-bufLength;
}
delete Buffer;
delete Strm;
接收方
void __fastcall TForm1::NMUDP1DataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
char *TmpBuff = new char[NumberBytes+1];
int i ;
//讀取接收到的檔案流
NMUDP1->ReadBuffer(TmpBuff,NumberBytes,i);
TmpBuff[NumberBytes] = '\0';
Memo2->Text = Memo2->Text+TmpBuff;
int iFileHandle;
if(!FileExists("E:\\dd.txt"))
iFileHandle = FileCreate("E:\\dd.txt");
else
{
iFileHandle = FileOpen("E:\\dd.txt",fmOpenReadWrite);
}
FileSeek(iFileHandle,0,2);
FileWrite(iFileHandle,TmpBuff,NumberBytes+1);
FileClose(iFileHandle);
delete TmpBuff;
}
uj5u.com熱心網友回復:
是不是太簡單了 都沒有人回答 好傷心~~··
uj5u.com熱心網友回復:
8k是因為網路硬體的限制造成的。需要更換更好的網路硬體uj5u.com熱心網友回復:
能不能分多次發uj5u.com熱心網友回復:
我是分成了2048個位元組在傳輸,可還是只能傳8k,所以才郁悶呢,說硬體限制也不太可能吧,都什么年代了 隨便一個交換機也應該不止8k,我問了高手同事,他說網卡的快取是8k,應該跟這個有關系,但他也沒空細究uj5u.com熱心網友回復:
什么年代了,居然還有人用NMUDP開發UDP通訊程式。可以肯定與硬體一毛錢關系木有。初步掃了一下代碼,如果代碼本身沒有錯誤(從來沒用過NMUDP這個垃圾,推薦你用ICS異步組件,ICS官網可下載),可能是丟包造成的,建議不要在接收事件里每次資料來的時候重新打開或新建檔案,建議把檔案打開或新建的動作移到事件外面預先準備好,這樣每次資料來時定位檔案末尾寫入即可。當然也有可能是NMUDP本身不完善你使用不得法的原因,暫不在考慮中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/81017.html
標籤:網絡及通訊開發
上一篇:我不懂錯在哪里了?
