转载,作为笔记
一篇分析P2P软件,使用UDP通信穿透NAT/Firewall的文章;重点分析了NAT和Firewall的区别。
P2P 是 Peer to Peer 的缩写, 意即点对点。这个点可以理解为电脑或者其它网络终端, 例如 headcall 网络电话机和无线手机. P2P 通讯不经过服务器, 直接通讯,无疑减少了服务器负担,降低了运营成本. 有一点需要指出的是, P2P 通讯初始化阶段是需要服务器协助的, 服务器开始有点象媒婆的角色, 两个人相亲见了面就没有媒婆什么事了.
转载,作为笔记
一篇分析P2P软件,使用UDP通信穿透NAT/Firewall的文章;重点分析了NAT和Firewall的区别。
P2P 是 Peer to Peer 的缩写, 意即点对点。这个点可以理解为电脑或者其它网络终端, 例如 headcall 网络电话机和无线手机. P2P 通讯不经过服务器, 直接通讯,无疑减少了服务器负担,降低了运营成本. 有一点需要指出的是, P2P 通讯初始化阶段是需要服务器协助的, 服务器开始有点象媒婆的角色, 两个人相亲见了面就没有媒婆什么事了.
在一些涉及到多线程的程序设计中,线程常常有一些消息要发送到用户界面进行显示。这方面处理的方法很多,有通过消息传递、全局变量、管道等。这里给出了一种通过消息传递和全局变量相结合的处理的方法。并且把代码封装到一个TLog类中,使用方便。在这里和大家分享。
//TLog类说明部分,事实上该类是一个“日志队列”
const
MAX_LOG_LEN=1024;
type
TLog=class
private
FLock:TCriticalSection;//互斥类,用于线程互斥访问
//定义日志项循环队列--由于队列的特性,最多能保存MAX_LOG_LEN-1条日志
FLines:array [0..MAX_LOG_LEN-1] of string;
FHead:integer;
FTail:integer;
//环队列定义结束
FMsgHandle:THandle;//消息接收窗口句柄
FMsgId:integer;//消息ID
FMsgParam:integer;//消息参数,可以用来区分不同的日志对象
function GetIsEmpty: boolean;
function GetCount: integer;
public
constructor Create(const MsgHandle:THandle;const MsgId,MsgParam:integer);
destructor Destroy;override;
procedure Add(const line:string);
procedure Gets(lines:TStrings);
procedure Clear;
property IsEmpty:boolean read GetIsEmpty;
property Count:integer read GetCount;
end;