🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.lang.pascal.delphi.misc
1 messages
1 total messages Started by W. D. Mon, 18 Jul 2005 22:32
Re: Convert C-Builder program to Delphi?
#179
Author: 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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads