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