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?
Author: W. D.
Date: Mon, 18 Jul 2005 22:32
Date: Mon, 18 Jul 2005 22:32
449 lines
12864 bytes
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