请教高手:如何用TUDP这个控件
如题:
如一台机向多台机发送数据以及多台机向这台机发数据时,不知道怎么设置?
急!(最好有一个例子)感激不尽!!
[解决办法]
如果lan,可以用广播,如果不是直接向指定ip发送,同时port要对应,很简单的,不过这个控件有bug,你发送数据的时候小心点,不要发太大,不然...
例子网上自己找了,bcb很久不写了
[解决办法]
__published:
TNMUDP *NMUDP1;
TEdit *Host;
TLabel *Label1;
TGroupBox *GroupBox1;
TEdit *UDPMsg;
TButton *BtSendMsg;
TRichEdit *Output;
TEdit *Port;
TLabel *Label4;
TLabel *Label3;
TGroupBox *GroupBox2;
TEdit *UDPStream;
TButton *BtLoadFile;
TButton *BtSendStream;
TOpenDialog *OpenDialog1;
TStatusBar *StatusBar1;
TButton *Button1;
void __fastcall BtSendMsgClick(TObject *Sender);
void __fastcall BtLoadFileClick(TObject *Sender);
void __fastcall BtSendStreamClick(TObject *Sender);
void __fastcall NMUDP1DataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port);
void __fastcall NMUDP1InvalidHost(bool &handled);
void __fastcall NMUDP1DataSend(TObject *Sender);
void __fastcall NMUDP1Status(TComponent *Sender,
AnsiString status);
void __fastcall NMUDP1StreamInvalid(bool &handled,
TStream *Stream);
private:
bool ValidStream;
public:
__fastcall Tmain_(TComponent* Owner);
************************************************************************************
#include <vcl.h>
#pragma hdrstop
#include "main.h "
#pragma package(smart_init)
#pragma resource "*.dfm "
Tmain_ *main_;
//---------------------------------------
__fastcall Tmain_::Tmain_(TComponent* Owner):TForm(Owner)
{
ValidStream = false;
}
//---------------------------------------
void __fastcall Tmain_::BtSendMsgClick(TObject *Sender)
{
NMUDP1-> RemoteHost = Host-> Text;
NMUDP1-> RemotePort = StrToInt(Port-> Text);
NMUDP1-> ReportLevel =Nmudp::Status_Basic;
Output-> Lines-> Add( "\n☆☆☆☆☆发送以下字串信息☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n ");
NMUDP1-> SendBuffer(UDPMsg-> Text.c_str(), strlen(UDPMsg-> Text.c_str()),
strlen(UDPMsg-> Text.c_str()));
Output-> Lines-> Add(UDPMsg-> Text);
}
//---------------------------------------
void __fastcall Tmain_::BtLoadFileClick(TObject *Sender)
{
if(OpenDialog1-> Execute())
{
UDPStream-> Text = OpenDialog1-> FileName;
ValidStream = true;
}
else
{
UDPStream-> Text = " ";
ValidStream = false;
}
}
//---------------------------------------
void __fastcall Tmain_::BtSendStreamClick(TObject *Sender)
{
if(!ValidStream)
{
MessageBox(NULL, "必须发送一个文件 ", "出错 ",MB_ICONERROR);
return;
}
NMUDP1-> RemoteHost = Host-> Text;
NMUDP1-> RemotePort = StrToInt(Port-> Text);
NMUDP1-> ReportLevel =Nmudp::Status_Basic;
const int ThreshHold = 2048;
//读入文件流
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;
}
//---------------------------------------
void __fastcall Tmain_::NMUDP1DataReceived(TComponent *Sender,int NumberBytes, AnsiString FromIP, int Port)
{
Output-> Lines-> Add( "\n★★收到以下信息————来自 "+FromIP+ "端口 "+IntToStr(Port)+ "的 "+IntToStr(NumberBytes)+ "个字节★★\n\n ");
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 Tmain_::NMUDP1InvalidHost(bool &handled)
{
String s;
s= "无效主机IP: "+NMUDP1-> RemoteHost;
MessageBox(NULL,s.c_str(), "出错 ",MB_ICONERROR);
handled=false; //不再尝试
}
//---------------------------------------
void __fastcall Tmain_::NMUDP1DataSend(TObject *Sender)
{
StatusBar1-> SimpleText= " ";
StatusBar1-> SimpleText= "数据发送 ";
}
//---------------------------------------
void __fastcall Tmain_::NMUDP1Status(TComponent *Sender, AnsiString status)
{
StatusBar1-> SimpleText= " ";
StatusBar1-> SimpleText=status;
}
//---------------------------------------
void __fastcall Tmain_::NMUDP1StreamInvalid(bool &handled, TStream *Stream)
{
ShowMessage( "数据流无效: 流未曾包含任何数据 ");
}
//---------------------------------------
我的一个实验,希望对你有用
[解决办法]
在这里加个循环。。。
for(int c=0;c <1000;c++)
{
::Sleep(50);
NMUDP1-> RemoteHost = Host-> Text+String(c);//硬件编号IP可以自己处理的把
NMUDP1-> RemotePort = StrToInt(Port-> Text);
NMUDP1-> ReportLevel =Nmudp::Status_Basic;
Output-> Lines-> Add( "\n☆☆☆☆☆发送以下字串信息☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n ");
NMUDP1-> SendBuffer(UDPMsg-> Text.c_str(), strlen(UDPMsg-> Text.c_str()),
strlen(UDPMsg-> Text.c_str()));
Output-> Lines-> Add(UDPMsg-> Text);
}
这样不就循环的发送出去了吗 ?
[解决办法]
我也在等这个问题,不过我现在不清楚的是在接收时如何收到来自不同机的数据.想了一整天了