📄 appserver.dpr
字号:
Program appserver;
{$APPTYPE CONSOLE}
{$INCLUDE mcompile.inc}
Uses
SysUtils, udt,
{$IFDEF DELPHI}
Windows, Winsock, JwaWinsock2, JwaWS2tcpip,
{$ENDIF}
{$IFDEF KYLIX}
Libc,
{$ENDIF}
StrUtils;
Var
hints: AddrInfo;
res: pAddrInfo;
Service: String;
serv: UDTSOCKET;
clientaddr: sockaddr_storage;
recver: UDTSOCKET;
Addrlen: Integer;
dSockAddr: SockAddr;
pid: Cardinal;
clienthost: Array [0..NI_MAXHOST - 1] Of Char;
clientservice: Array [0..NI_MAXSERV - 1] Of Char;
{$ifdef KYLIX}
Function recvdata(usocket: Pointer): Pointer; Cdecl;
{$else}
Function recvdata(usocket: Pointer): DWORD; Stdcall;
{$endif}
Var
recver: UDTSOCKET;
data: pChar;
size: Integer;
rsize, rs: Integer;
Begin
recver := UDTSOCKET(usocket);
size := 100000;
data := AllocMem(size);
while true Do
begin
rsize := 0;
while rsize < size Do
begin
rs := UDT.recv(recver, data + rsize, size - rsize, 0);
if UDT.ERROR = rs Then
begin
WriteLn('recv:' + UDT.getlasterror);
break;
end;
Inc(rsize, rs);
end;
if rsize < size Then break;
end;
FreeMem(data, size);
UDT.close(recver);
{$ifdef KYLIX}
Result := Nil;
{$else}
Result := 0;
{$endif}
End;
Begin
If (0 <> ParamCount) And ((1 <> ParamCount) Or (ParamStr(1) = '')) Then
Begin
WriteLn('usage: appserver [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 := SOCK_DGRAM;
Service := '9000';
If 2 = ParamCount Then service := ParamStr(1);
If 0 <> GetAddrInfo(Nil, pChar(Service), @hints, res) Then
Begin
WriteLn('illegal port number or port is busy.');
Halt(0);
End;
serv := UDT.socket(res.ai_family, res.ai_socktype, res.ai_protocol);
// UDT Options
//UDT::setsockopt(serv, 0, UDT_CC, new CCCFactory<CUDPBlast>, sizeof(CCCFactory<CUDPBlast>));
//UDT::setsockopt(serv, 0, UDT_MSS, new int(9000), sizeof(int));
//UDT::setsockopt(serv, 0, UDT_RCVBUF, new int(10000000), sizeof(int));
//UDT::setsockopt(serv, 0, UDP_RCVBUF, new int(10000000), sizeof(int));
If UDT.ERROR = UDT.bind(serv, res.ai_addr, res.ai_addrlen) Then
Begin
WriteLn('bind: ' + UDT.getlasterror);
Halt(0);
End;
FreeAddrInfo(res);
WriteLn('server is ready at port: ' + service);
If UDT.ERROR = UDT.listen(serv, 10) Then
Begin
WriteLn('listen: ' + UDT.getlasterror);
Halt(0);
End;
Addrlen := SizeOf(clientaddr);
While true Do
Begin
Move(clientaddr, dSockAddr, SizeOf(dSockAddr));
recver := UDT.accept(serv, @dSockAddr, @addrlen);
If UDT.INVALID_SOCK = recver Then
Begin
WriteLn('accept: ' + UDT.getlasterror);
Halt(0);
End;
{$IFDEF DELPHI}
GetNameinfo(@dSockAddr, addrlen, clienthost, sizeof(clienthost), clientservice, sizeof(clientservice), NI_NUMERICHOST Or NI_NUMERICSERV);
{$ENDIF}
{$IFDEF KYLIX}
GetNameinfo(dSockAddr, addrlen, clienthost, sizeof(clienthost), clientservice, sizeof(clientservice), NI_NUMERICHOST Or NI_NUMERICSERV);
{$ENDIF}
WriteLn('new connection: ' + clienthost + ':' + clientservice);
{$ifdef KYLIX}
pthread_create(pid, Nil, Addr(recvdata), Pointer(recver));
pthread_detach(pid);
{$else}
CreateThread(Nil, 0, Addr(recvdata), Pointer(recver), 0, pid);
{$endif}
End;
udt.close(serv);
Halt(1);
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -