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

Start Here to Find It Fast!™ -> http://www.US-Webmasters.com/best-start-page/
$8.77 Domain Names -> http://domains.us-webmasters.com/

__________________________________________________
Delphi-Talk mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi-talk

Reply via email to