有关TIdUDPClient和TIdUDPserver

时间:2017-06-01 15:22:25

标签: delphi udp indy

我有一个代码,使用TIdTCPClient和TIdTCPServer将音频流从服务器发送到客户端,它工作正常,但在使用大量客户端时效率不高所以我决定使用TIdUDPClient和TIdUDPServer但是遇到了一些问题我不明白(我使用最新的indy快照)。 服务器部分代码:

.......
//AudioCallback - is a callback function for a 3rd party lib that prepares audio stream, it is called several times per second
...
var fStream:TFileStream;
...    
procedure AudioCallback(buffer: LPSTR; len: UINT); cdecl;
var
  IdUDPClient: TIdUDPClient;
  IdBytes: TIdBytes;
begin
//len is always 1024
  IdBytes := RawToBytes(buffer^, len);//works bad
{  for cb := 0 to High(IdBytes) do
    IdBytes[cb] := cb mod 256;}//works fine
{  for cb := 0 to High(IdBytes) do
    IdBytes[cb] := Random(255);}//works bad
{  for cb := 0 to High(IdBytes) do
    IdBytes[cb] := cb mod 2;}//works fine
  fStream.Write(IdBytes[0], length(IdBytes));//for testing purposes
  IdUDPClient := TIdUDPClient.Create;
  with IdUDPClient do
    try
      Host := '127.0.0.1';
      Port := 32563;
      try
        Connect;
        if Connected then
          SendBuffer(IdBytes);
        Disconnect;
      except
      end;
    finally
      Free;
    end;
end;

客户端部分很简单:

....
var fStream:TFileStream;
....
procedure TClient.IdUDPReadEvent(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  fStream.Write(AData[0],length(AData));
end;
....

我不明白的问题:

  1. 我尝试使用非本地IdUDPClient,但第二次调用 方法SendBuffer(IdBytes)或Connect总是引发idException “无效的参数”,尽管IdUDPClient属性仍然存在 相同
  2. 从服务器端发送并收到的数据包 客户不同。我测试了很多次。第一个收到的数据包是 总是一样。第二个和以下其他是相同的 只有当您以某种常规方式手动填充数据包时 IdBytes [cb]:= cb mod 256.如果您保留原始数据或填写随机数据 - 您不会收到您发送的内容。

0 个答案:

没有答案