关于UDP的问题

caomin64 2005-05-07 01:16:33
我编写了个传输文件的程序,用UDP控件,因为UDP一次只能传输64K,如果我的文件大于64K,还用UDP怎么能实现,100元人民币相送,只要解决问题,立即给打到卡上,我是守信的,为加100分
...全文
171 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2005-07-18
  • 打赏
  • 举报
回复
学习
我不懂电脑 2005-05-08
  • 打赏
  • 举报
回复
那就把文件分成64k的整数倍段,然后加上顺序号,依次发送,接收端接收到后进行排序,丢失重传等操作获得稳定顺序的数据分组存到文件。
caomin64 2005-05-07
  • 打赏
  • 举报
回复
h98458:大部分代码我都已用,我试验一下
h98458 2005-05-07
  • 打赏
  • 举报
回复
不知这例子行不行,帖出来给你看看:
//---------------------------------------------------------------------------
#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ValidStream = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMUDP1DataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP)
{
char *TmpBuffer = new char[NumberBytes + 1];

int i;
NMUDP1->ReadBuffer(TmpBuffer, NumberBytes, i);
TmpBuffer[NumberBytes] = '\0';
Output->Text = Output->Text + TmpBuffer;

delete [] TmpBuffer;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtSendMsgClick(TObject *Sender)
{
// UDP does not timeout because it does not connect.
NMUDP1->RemoteHost = Host->Text;
NMUDP1->RemotePort = StrToInt(Port->Text);
NMUDP1->ReportLevel = Nmudp::Status_Basic;

NMUDP1->SendBuffer(UDPMsg->Text.c_str(), strlen(UDPMsg->Text.c_str()),
strlen(UDPMsg->Text.c_str()));
Output->Lines->Add("");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtLoadFileClick(TObject *Sender)
{
if(OpenDialog1->Execute())
{
UDPStream->Text = OpenDialog1->FileName;
ValidStream = true;
}
else
{
UDPStream->Text = "";
ValidStream = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtSendStreamClick(TObject *Sender)
{
if(!ValidStream)
{
MessageBox(NULL, "Need a file to send.", "Invalid input", MB_ICONERROR);
return;
}

NMUDP1->RemoteHost = Host->Text;
NMUDP1->RemotePort = StrToInt(Port->Text);
NMUDP1->ReportLevel = Nmudp::Status_Basic;
const int ThreshHold = 2048;

// Load the stream.
TFileStream *Strm = new TFileStream(UDPStream->Text, fmOpenRead);
char *Buffer = new char[ThreshHold];
int BuffSize = Strm->Size;
int Buffers = BuffSize / ThreshHold;

for(int i=0; i <= Buffers; i++)
{
if(BuffSize > 2048)
{
Strm->Read(Buffer, ThreshHold);
NMUDP1->SendBuffer(Buffer, ThreshHold, ThreshHold);
}
else
{
Strm->Read(Buffer, BuffSize);
NMUDP1->SendBuffer(Buffer, BuffSize, BuffSize);
}

BuffSize -= ThreshHold;
}

delete Buffer;
delete Strm;

Output->Lines->Add("");
}
void __fastcall TForm1::NMUDP1DataSend(TObject *Sender)
{
StatusBar1->SimplePanel = TRUE;
StatusBar1->SimpleText = "Data Sent";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMUDP1InvalidHost(bool &handled)
{
AnsiString TmpStr;

if (InputQuery("Invalid Host!", "Specify a new host:", TmpStr))
{
NMUDP1->RemoteHost = TmpStr;
handled = TRUE;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMUDP1Status(TComponent *Sender, AnsiString status)
{
if (StatusBar1 != 0)
StatusBar1->SimpleText = status;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMUDP1StreamInvalid(bool &handled, TStream *Stream)
{
ShowMessage("Invalid Stream: Stream contains no data");
}
//---------------------------------------------------------------------------

tohigh 2005-05-07
  • 打赏
  • 举报
回复
http://hackangel.go1.icpcn.com/lilisoft/UDPTrsmtFile.rar

csdn的blog最近打不开!
http://blog.csdn.net/pclili/archive/2004/12/12/213631.aspx
纯冰糖 2005-05-07
  • 打赏
  • 举报
回复
或者分解分段发送可以不?
纯冰糖 2005-05-07
  • 打赏
  • 举报
回复
你用TStream处理一下,文件流处理

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧