📄 appclient.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 + -