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

📄 appserver.dpr

📁 DELPHI 封装的UDT类库..可以在DELPHI使用开源的UDT类库.
💻 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 + -