急救:Delphi中IdUDPServer局域网内严重丢包的问题
本帖最后由 zhangdaodong 于 2013-06-24 13:06:06 编辑 本人想写一个局域网监控程序,有发消息,屏幕截图等。接收代码如下:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: array of Byte; ABinding: TIdSocketHandle);
var
a:TMemoryStream;
Command:TCommand; //这是我自己定义的一个record
begin
a := TMemoryStream.Create;
a.WriteBuffer(AData[0],Length(AData));
a.Position := 0;
a.Read(Command,SizeOf(Command));
FreeAndNil(a);
ExcuteCommand(Command); //通过函数处理接收到的record包
end;
TCommand = record
CommandType : TOP; //这中我定义的一个操作枚举类型
CommandText : string;
Timeout : Integer;
FileStream : TMemoryStream; //这里面主要是存放截的图,大小不会超过3MB
FormIP : string;
ToIP : string;
end;
TTOP = (one, two);
TCommand = packed record
PackageSize: DWORD; // 整个包的大小,占4字节
CommandType: TTOP; // 枚举类型,可以,因为其实质就是Byte类型。占1字节
Command: string[9]; // 命令行文本,占10字节。string的第1个字节用来描述长度,可用字符为9 byte
PicSize: DWORD; // 图片Size,占4字节
end;
// 调用
var
Value: TCommand;
PicBuf: TBytesStream;
PicData: array of Byte;
SendBuf: TMemoryStream;
begin
Buffer.CommandType := two;
Buffer.Command := 'Hello';
// 模拟一个图片数据,为了方便说明,假设图片只有5字节
SetLength(PicData, 5);
PicData[0] := $11;
PicData[1] := $22;
PicData[2] := $33;
PicData[3] := $44;
PicData[4] := $55;
Buffer.PicSize := Length(PicData);
Buffer.PackageSize := SizeOf(Buffer) + Length(PicData); // 这里包的总长度为19
// 将要发送的数据写入缓冲区
SendBuf := TMemoryStream.Create;
SendBuf.WriteBuffer(Buffer, SizeOf(Buffer));
SendBuf.WriteBuffer(PicData[0], Length(PicData));
SendBuf.Free;
end;
