Article View: comp.lang.pascal.delphi.misc
Article #179Re: Convert C-Builder program to Delphi?
From: 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
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-mailShow 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)