🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.pascal.delphi.misc
Article #179

Re: Convert C-Builder program to Delphi?

#179
From: W. D.
Date: Mon, 18 Jul 2005 22:32
449 lines
12864 bytes
Hi Folks,

Thanks for the help you have provided on this
conversion project.

Still plugging away.

Now having problems with Winsock functions and
associated pointers.  For some reason, I can't
seem to "recv" data uncorrupted.  I've
tried it using a string buffer and as a PChar.

I am completely baffled.  There is probably
something obviously wrong with my code, but
I can't see it.

Below is the code in both the string version
and PChar version.

Please tell me what I am doing wrong!!??


String Version:

Would an Array of Char be better?

What about NULLs (#0) in the data?  How does one
prevent the program from assuming that the string
is ending, since NULLs can be part of the TCP
data coming back?

// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

Function BlkgTCP.GetBlock(size: uint16;
                          data: uint8Ptr):
                          uint32;
                          // Override;  // Virtual;

  Var
    // Number of bytes to read:
    BytesRead: uint32;

    Cnt: Integer;
    Err: Integer;

    BigBuf: String;
    LilBuf: String;

  // C++: {
  Begin

  LilBuf := '';
  BigBuf := '';

  WriteLn('BlkgTCP.GetBlock: Entering...');


  // Number of bytes read:
  // C++: uint32 BytesRead = (uint32)size;
  BytesRead := uint32(size);

  WriteLn('BlkgTCP.GetBlock: BytesRead: ' + IntToStr(BytesRead));

  // Read data from the socket
  // C++: while (BytesRead > 0)
  While (BytesRead > 0) Do

    // C++: {
    Begin

    WriteLn('======================================================');
    WriteLn('BlkgTCP.GetBlock: Pre-recv:');
    WriteLn('BlkgTCP.GetBlock: MySocket: ' + IntToStr(MySocket));
    WriteLn('BlkgTCP.GetBlock: BytesRead: ' + IntToStr(BytesRead));
    WriteLn('------------------------------------------');

    WriteLn('BlkgTCP.GetBlock: Attempting Winsock.recv...');

    LilBuf := '';
    SetLength(LilBuf, 4096);

    // function recv(s: TSocket; var Buf; len, flags: Integer):
    //    Integer; stdcall;
    Cnt := Winsock.recv(MySocket, LilBuf[1], BytesRead, 0);

    If (Cnt <> SOCKET_ERROR)
      Then SetLength(LilBuf, Cnt)
      Else SetLength(LilBuf, 0);

    BigBuf := BigBuf +  LeftStr(LilBuf, Cnt);

    WriteLn('BlkgTCP.GetBlock: Post-recv:');
    WriteLn('BlkgTCP.GetBlock: Cnt: ' + IntToStr(Cnt));
    WriteLn('BlkgTCP.GetBlock: MySocket: ' + IntToStr(MySocket));
    WriteLn('BlkgTCP.GetBlock: LilBuf: ' + LilBuf);
    WriteLn('BlkgTCP.GetBlock: BigBuf: ' + BigBuf);
    WriteLn('BlkgTCP.GetBlock: BytesRead: ' + IntToStr(BytesRead));

    WriteLn('====================================================');

    // Wait for user to hit 'Enter':
    WriteLn('Press ENTER to continue...');
    ReadLn;

    // C++: if (!Cnt)
    If (Cnt = 0) Then

      Begin

      WriteLn('BlkgTCP.GetBlock: Cnt = 0');

      // C++: return SOCK_CLOSED;
      Result := SOCK_CLOSED;

      WriteLn('BlkgTCP.GetBlock: Result := SOCK_CLOSED');

      Exit;
      End;  //  If (Cnt = 0)...


    // C++: if (Cnt == SOCKET_ERROR)
    // SOCKET_ERROR is -1
    If (Cnt = SOCKET_ERROR) Then

      // C++: {
      Begin

      WriteLn('BlkgTCP.GetBlock: Cnt = SOCKET_ERROR');

      // C++: int err = WSAGetLastError();
      err := WSAGetLastError();

      // C++: WSASetLastError(0);
      WSASetLastError(0);

      // C++: return err;
      Result := err;
      Exit;

      // C++: }
      End;  //  If (Cnt = SOCKET_ERROR)

    WriteLn('BlkgTCP.GetBlock: Cnt: ' + IntToStr(Cnt));

    // C++: StatxBytes += Cnt;
    StatxBytes := StatxBytes + Cardinal(Cnt);

    WriteLn('BlkgTCP.GetBlock: StatxBytes: ' +
             IntToStr(StatxBytes));

    // C++: BytesRead -= Cnt;
    BytesRead := BytesRead - Cardinal(Cnt);

    WriteLn('BlkgTCP.GetBlock: BytesRead: ' +
             IntToStr(BytesRead));

    WriteLn('BlkgTCP.GetBlock: Incrementing pcData by Cnt...');

    // -----------------------------------------------------------
    WriteLn('BlkgTCP.GetBlock: BigBuf: ' + BigBuf);

    BigBuf := BigBuf + #0;
    WriteLn('BlkgTCP.GetBlock: BigBuf: ' + BigBuf);

    // data^ := PChar(BigBuf);
    // data := @BigBuf;
    // data^ := uint8Ptr(@BigBuf);
    // data^ := uint8Ptr(BigBuf);
    data := uint8Ptr(PChar(BigBuf));

    WriteLn('BlkgTCP.GetBlock: data: ' + PChar(data));

    // ----------------------------------------------------------

    // C++: }
    End;  //  While (BytesRead > 0)

  WriteLn('BlkgTCP.GetBlock: COMM_SUCCESS');

  // C++: return COMM_SUCCESS;
  Result := COMM_SUCCESS;

  WriteLn('BlkgTCP.GetBlock: Exiting...');

  // Wait for user to hit 'Enter':
  WriteLn('Press ENTER to continue...');
  ReadLn;

  Exit;

  // C++: }
  End;  //  Function BlkgTCP.GetBlock(


// End String version
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$






// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

PChar Version:


Function BlkgTCP.GetBlock(size: uint16;
                          data: uint8Ptr):
                          uint32;
                          // Override;  // Virtual;

  Var
    //number of bytes read
    BytesRead: uint32;

    // pcData: PChar;
    // pcData: Array[0..MaxBufferSize] of Char;
    // pcData: Pointer;
    // pcData: Array[0..32767] of Char;
    // Was:  pcData: uint8Ptr;
    pcData: PChar;

    Cnt: Integer;
    Err: Integer;

    pcDataStr: String;

    SomeInt: Integer;


  // C++: {
  Begin

  WriteLn('BlkgTCP.GetBlock: Entering...');

  // Number of bytes read:
  // C++: uint32 BytesRead = (uint32)size;
  BytesRead := uint32(size);

  WriteLn('BlkgTCP.GetBlock: BytesRead: ' + IntToStr(BytesRead));

  WriteLn('BlkgTCP.GetBlock: ''data'' address: ' +
              PtrToStr(data));

  WriteLn('BlkgTCP.GetBlock: pcData := data;');

  // C++: char* pcData = (char * )data;
  // pcData := String(data^);
  // pcData[pcDidx] := Char(data^);
  // Was:  pcData := data;
  pcData := PChar(data);


  WriteLn('BlkgTCP.GetBlock: ''data'' address: ' +
              PtrToStr(data));
  WriteLn('BlkgTCP.GetBlock: pcData address: ' +
              PtrToStr(pcData));

  // Read data from the socket
  // C++: while (BytesRead > 0)
  While (BytesRead > 0) Do

    // C++: {
    Begin


    WriteLn('====================================================');
    WriteLn('BlkgTCP.GetBlock: Pre-recv:');
    WriteLn('BlkgTCP.GetBlock: MySocket: ' + IntToStr(MySocket));

    WriteLn('BlkgTCP.GetBlock: pcData: ' + pcData);

    If pcData <> NIL
    Then SomeInt := Ord(pcData^)
    Else SomeInt := 999;

    WriteLn('BlkgTCP.GetBlock: BytesRead: ' + IntToStr(BytesRead));

    WriteLn('BlkgTCP.GetBlock: pcData INT: ' + IntToStr(SomeInt));

    WriteLn('BlkgTCP.GetBlock: ''data'' address: ' +
              PtrToStr(data));
    WriteLn('BlkgTCP.GetBlock: pcData address: ' +
              PtrToStr(pcData));

    WriteLn('BlkgTCP.GetBlock: pcData CodeToText: ' +
         Code2Text(SomeInt));

    WriteLn('------------------------------------------');

    // Wait for user to hit 'Enter':
    WriteLn('Press ENTER to continue...');
    ReadLn;

    WriteLn('BlkgTCP.GetBlock: Attempting Winsock.recv...');

    // function recv(s: TSocket; var Buf; len, flags: Integer):
    //               Integer; stdcall;
    // C++: int Cnt = recv(MySocket, pcData, BytesRead, 0);
    // Cnt := Winsock.recv(MySocket, pcData, BytesRead, 0);
    // Nope: Cnt := Winsock.recv(MySocket, @pcData, BytesRead, 0);
    // Was: Cnt := Winsock.recv(MySocket, pcData^, BytesRead, 0);
    Cnt := Winsock.recv(MySocket, pcData, BytesRead, 0);

    WriteLn('BlkgTCP.GetBlock: Post-recv:');
    WriteLn('BlkgTCP.GetBlock: Cnt: ' + IntToStr(Cnt));
    WriteLn('BlkgTCP.GetBlock: MySocket: ' + IntToStr(MySocket));

    // WriteLn('BlkgTCP.GetBlock: pcData: ' + PChar(pcData));
    WriteLn('BlkgTCP.GetBlock: pcData: ' + pcData);

    pcDataStr := PChar(pcData);
    WriteLn('BlkgTCP.GetBlock: pcDataStr: ' + pcDataStr);
    WriteLn('BlkgTCP.GetBlock: pcDataStr Length: ' +
    IntToStr(Length(pcDataStr)));

    If pcData <> NIL
    Then SomeInt := Ord(pcData^)
    Else SomeInt := 999;
    WriteLn('BlkgTCP.GetBlock: pcData INT: ' + IntToStr(SomeInt));


    // WriteLn('BlkgTCP.GetBlock: pcData CodeToText: ' +
    //    Code2Text(Trunc(pcData^)));
    
    WriteLn('BlkgTCP.GetBlock: pcData CodeToText: ' +
             Code2Text(SomeInt));

    WriteLn('BlkgTCP.GetBlock: ''data'' address: ' +
              PtrToStr(data));
    WriteLn('BlkgTCP.GetBlock: pcData address: ' +
              PtrToStr(pcData));

    WriteLn('BlkgTCP.GetBlock: BytesRead: ' + IntToStr(BytesRead));

    WriteLn('====================================================');

    // Wait for user to hit 'Enter':
    WriteLn('Press ENTER to continue...');
    ReadLn;

    // C++: if (!Cnt)
    If (Cnt = 0) Then

      Begin

      WriteLn('BlkgTCP.GetBlock: Cnt = 0');

      // C++: return SOCK_CLOSED;
      Result := SOCK_CLOSED;

      WriteLn('BlkgTCP.GetBlock: Result := SOCK_CLOSED');

      Exit;
      End;  //  If (Cnt = 0)...


    // C++: if (Cnt == SOCKET_ERROR)
    // SOCKET_ERROR is -1
    If (Cnt = SOCKET_ERROR) Then

      // C++: {
      Begin

      WriteLn('BlkgTCP.GetBlock: Cnt = SOCKET_ERROR');

      // C++: int err = WSAGetLastError();
      err := WSAGetLastError();

      // C++: WSASetLastError(0);
      WSASetLastError(0);

      // C++: return err;
      Result := err;
      Exit;

      // C++: }
      End;  //  If (Cnt = SOCKET_ERROR)

    WriteLn('BlkgTCP.GetBlock: Cnt: ' + IntToStr(Cnt));

    // C++: StatxBytes += Cnt;
    StatxBytes := StatxBytes + Cardinal(Cnt);

    WriteLn('BlkgTCP.GetBlock: StatxBytes: ' +
             IntToStr(StatxBytes));

    // C++: BytesRead -= Cnt;
    BytesRead := BytesRead - Cardinal(Cnt);

    WriteLn('BlkgTCP.GetBlock: BytesRead: ' +
             IntToStr(BytesRead));

    WriteLn('BlkgTCP.GetBlock: Incrementing pcData by Cnt...');

    // C++: pcData += Cnt;
    // pcData := pcData + Cnt;   // Operator not applicable to this
                                 //    operand type
    // pcData := @pcData + Cnt;  // Operator not applicable to this
                                 //    operand type
    // @pcData := pcData + Cnt;  // Left side cannot be assigned to
    Inc(pcData, Cnt);

    // WriteLn('BlkgTCP.GetBlock: pcData: ' + pcData);
    // WriteLn('BlkgTCP.GetBlock: pcData: ' + PChar(pcData));
    WriteLn('BlkgTCP.GetBlock: pcData: ' + pcData);

    pcDataStr := PChar(pcData);
    WriteLn('BlkgTCP.GetBlock: pcDataStr: ' + pcDataStr);
    WriteLn('BlkgTCP.GetBlock: pcDataStr Length: ' +
      IntToStr(Length(pcDataStr)));

    WriteLn('BlkgTCP.GetBlock: ''data'' address: ' +
              PtrToStr(data));
    WriteLn('BlkgTCP.GetBlock: pcData address: ' +
              PtrToStr(pcData));

    If pcData <> NIL
    Then SomeInt := Ord(pcData^)
    Else SomeInt := 999;
    WriteLn('BlkgTCP.GetBlock: pcData INT: ' + IntToStr(SomeInt));

    // WriteLn('BlkgTCP.GetBlock: pcData CodeToText: ' +
    //            Code2Text(Trunc(pcData^)));
    WriteLn('BlkgTCP.GetBlock: pcData CodeToText: ' +
        Code2Text(SomeInt));

    // C++: }
    End;  //  While (BytesRead > 0)

  WriteLn('BlkgTCP.GetBlock: COMM_SUCCESS');

  // C++: return COMM_SUCCESS;
  Result := COMM_SUCCESS;

  WriteLn('BlkgTCP.GetBlock: Exiting...');

  // Wait for user to hit 'Enter':
  WriteLn('Press ENTER to continue...');
  ReadLn;

  Exit;

  // C++: }
  End;  //  Function BlkgTCP.GetBlock(


//  End PChar version
Technical Details
Message-ID: <42DC2DE5.881@US-Webmasters.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.maxwell.syr.edu!news.netins.net!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Thread: 10baee,53da7db842d52a01,start
X-Google-Thread: 1036eb,53da7db842d52a01,start
X-Google-Attributes: gid10baee,gid1036eb,public
X-Google-Language: ENGLISH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.maxwell.syr.edu!news.netins.net!not-for-mail
From: "W. D." <NewsGroups@US-Webmasters.com>
Newsgroups: comp.lang.pascal.delphi.misc,borland.public.delphi.internet.winsock
Subject: Re: Convert C-Builder program to Delphi?
Date: Mon, 18 Jul 2005 17:32:05 -0500
Organization: http://www.US-Webmasters.com/best-start-page/
Lines: 449
Message-ID: <42DC2DE5.881@US-Webmasters.com>
Reply-To: NewsGroups@US-Webmasters.com
NNTP-Posting-Host: batv-01-031.dialup.netins.net
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Trace: news.netins.net 1121725928 9013 216.248.109.32 (18 Jul 2005 22:32:08 GMT)
X-Complaints-To: abuse@netins.net
NNTP-Posting-Date: Mon, 18 Jul 2005 22:32:08 +0000 (UTC)
X-Mailer: Mozilla 3.04Gold (Win95; U)