⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 appclient.dpr

📁 DELPHI 封装的UDT类库..可以在DELPHI使用开源的UDT类库.
💻 DPR
字号:
Program appserver;

{$APPTYPE CONSOLE}
{$INCLUDE mcompile.inc}

 uses
  SysUtils,
  udt,
  {$ifdef KYLIX}
  Libc,
  {$else}
  Windows,
  Winsock,
  JwaWinsock2,
  JwaWS2tcpip,
  {$ENDIF}
  StrUtils,
  mudt;

Var
  hints: addrinfo;
  local, peer: pAddrInfo;
  client: UDTSOCKET;
  size, i, ss, ssize: Integer;
  data: pChar;
  pid: Cardinal;

{$ifdef KYLIX}
Function monitor(s: Pointer): Pointer; Cdecl;
{$else}
Function monitor(s: LPVOID): DWORD; StdCall;
{$ENDIF}
 Var
  u: UDTSOCKET;
  perf: TRACEINFO;
 Begin
  u := UDTSOCKET(s);

  WriteLn('SendRate(Mb/s)'#9'RTT(ms)'#9'CWnd'#9'PktSndPeriod(us)'#9'RecvACK'#9'RecvNAK');

  While true Do
   Begin

    Sleep(1000);
    
    If UDT.ERROR = UDT.perfmon(u, @perf) Then
     Begin
      WriteLn('perfmon: '+ UDT.getlasterror);
      Break;
     End;

    WriteLn(Format('%.2f', [perf.mbpsSendRate]) + #9#9 + Format('%.2f', [perf.msRTT]) + #9 + IntToStr(perf.pktCongestionWindow) + #9 + Format('%.2f', [perf.usPktSndPeriod]) + #9#9#9 + IntToStr(perf.pktRecvACK) + #9 + IntToStr(perf.pktRecvNAK));
   End;
  {$ifdef KYLIX}
  Result := Nil;
  {$else}
  Result := 0;
  {$endif}
 End;

Begin

 If (2 <> ParamCount) Or (ParamStr(2) = '') Then
  Begin
   WriteLn('usage: appclient server_ip server_port');
   Halt(0);
  End;

 FillChar(hints, sizeof(addrinfo), #0);

 hints.ai_flags := AI_PASSIVE;
 hints.ai_family := AF_INET;
 //hints.ai_socktype := Integer(SOCK_STREAM);
 hints.ai_socktype := Integer(SOCK_DGRAM);

 If 0 <> getaddrinfo(Nil, '9000', @hints, local) Then
  Begin
   WriteLn('incorrect network address.');
   Halt(0);
  End;

 Client := UDT.socket(local^.ai_family, local^.ai_socktype, local^.ai_protocol);

 // UDT Options
 //UDT::setsockopt(client, 0, UDT_CC, new CCCFactory<CUDPBlast>, sizeof(CCCFactory<CUDPBlast>));
 //UDT::setsockopt(client, 0, UDT_MSS, new int(9000), sizeof(int));
 //UDT::setsockopt(client, 0, UDT_SNDBUF, new int(10000000), sizeof(int));
 //UDT::setsockopt(client, 0, UDP_SNDBUF, new int(10000000), sizeof(int));

 {$ifdef DELPHI}
 size := 1052;
 UDT.setsockopt(client, 0, UDT_MSS, @size, sizeof(Integer));
 {$endif}

 // for rendezvous connection, enable the code below
 {
   UDT::setsockopt(client, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool));
   if (UDT::ERROR == UDT::bind(client, local->ai_addr, local->ai_addrlen))
    begin
      cout << "bind: " << UDT::getlasterror().getErrorMessage() << endl;
      return 0;
    end
  }

 freeaddrinfo(local);

 If 0 <> getaddrinfo(pChar(ParamStr(1)), pChar(ParamStr(2)), @hints, peer) Then
  Begin
   WriteLn('incorrect server/peer address. ' + ParamStr(1) + ':' + ParamStr(2));
   Halt(0);
  End;

 // connect to the server, implict bind
 If UDT.ERROR = UDT.connect(client, peer^.ai_addr, peer^.ai_addrlen) Then
  Begin
   WriteLn('connect: '+ UDT.getlasterror());
   Halt(0);
  End;

 freeaddrinfo(peer);

   // using CC method
   //CUDPBlast* cchandle = NULL;
   //int temp;
   //UDT::getsockopt(client, 0, UDT_CC, &cchandle, &temp);
   //if (NULL != cchandle)
   //   cchandle->setRate(500);

 size := 100000;
 data := AllocMem(size);

 {$ifdef KYLIX}
 pthread_create(pid, Nil, Addr(monitor), Pointer(client));
 {$else}
 pid := 0;
 CreateThread(Nil, 0, Addr(monitor), Pointer(Client), 0, pid);
 {$endif}

 For i := 0 to 999999 Do
  Begin
   {ssize := 0;
   While ssize < size Do
    Begin
     ss := UDT.send(client, data + ssize, size - ssize, 0);
     If UDT.ERROR = ss Then
      Begin
       WriteLn('send:' + UDT.getlasterror);
       Break;
      End;
     Inc(ssize, ss);
    End;

   If ssize < size Then Break;}
   ss := UDT.sendmsg(client, data, size, -1, true);
   If UDT.ERROR = ss Then
    Begin
     WriteLn('send:' + UDT.getlasterror);
     Break;
    End;
  End;

 UDT.close(client);

 FreeMem(data, size);

 Halt(1);
End.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -