关键字 C++ Builder下三种UDP通信实现方法的比较
出处
主要讨论一下数据的接受:
1.NMUDP控件
这个控件使用起来比较简单,设定监听端口,然后响应DataReceived事件就可以了,例如:
void __fastcall TMoniter::NMUDPDataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
/* 用一个标志变量控制控件受信后是否执行需要的操作 */
if (recvFlag)
{
int rl;
/* 用于接受数据的内存 */
unsigned char rbuf[1024 * 9];
/* 控件的ReadBuffer方法,把接受到的数据存储到rbuf */
NMUDP -> ReadBuffer(rbuf , sizeof(rbuf) , rl);
/* 字符串结束 */
rbuf[rl]=0;
/* stream是事先定义的文件指针 */
if (stream != NULL)
{
/* 自编doLog函数,把接收数据写入日志文件 */
doLog( false , rbuf ,rl ;
}
}
}
这个控件的优点是使用简单、效率比较高,但是只支持2K的缓冲,所以上面开辟的9K内存是多余的。2K的限制使我在项目中不得不放弃了这个控件。
2.IdUDPServer控件
使用方法跟NMUDP差不多,响应UDPRead事件就可以了,例如:(注释参考1)
出处
主要讨论一下数据的接受:
1.NMUDP控件
这个控件使用起来比较简单,设定监听端口,然后响应DataReceived事件就可以了,例如:
void __fastcall TMoniter::NMUDPDataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
/* 用一个标志变量控制控件受信后是否执行需要的操作 */
if (recvFlag)
{
int rl;
/* 用于接受数据的内存 */
unsigned char rbuf[1024 * 9];
/* 控件的ReadBuffer方法,把接受到的数据存储到rbuf */
NMUDP -> ReadBuffer(rbuf , sizeof(rbuf) , rl);
/* 字符串结束 */
rbuf[rl]=0;
/* stream是事先定义的文件指针 */
if (stream != NULL)
{
/* 自编doLog函数,把接收数据写入日志文件 */
doLog( false , rbuf ,rl ;
}
}
}
这个控件的优点是使用简单、效率比较高,但是只支持2K的缓冲,所以上面开辟的9K内存是多余的。2K的限制使我在项目中不得不放弃了这个控件。
2.IdUDPServer控件
使用方法跟NMUDP差不多,响应UDPRead事件就可以了,例如:(注释参考1)