Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Korrekte Typumwandlung nach TSocket (https://www.delphipraxis.net/108039-korrekte-typumwandlung-nach-tsocket.html)

engel90 6. Feb 2008 19:28


Korrekte Typumwandlung nach TSocket
 
Hallo,
ich bin gerade dabei einen Server für ein eigenes Chatprogramm zu entwickeln. Dabei bin ich auf folgendes Problem gestoßen:
Der Server soll multithreaded sein, d.h. er soll für jeden neuen Client einen neuen Thread erstellen. Zum Erstellen der Threads möchte ich die WinAPI Funktionen CreateThread() oder BeginThread() benutzen. Als Parameter möchte ich den Threads eine TSocket (WinSock.pas) Variable übergeben.

Delphi-Quellcode:
...

function ThreadFunk(param: Pointer): Longint; stdcall;
var
  client: TSocket;
begin
  // Übergabeparameter in ein TSocket zurückführen
  client := param^; // >> Muss hier nicht noch irgenteine Typumwandlung folgen? Da ich vermute das die Fehler die ich im       Serverprogramm bekomme darauf zurückzuführen sind, das hier irgendwas nicht stimmt
  ..
end;

...

var
  // Socket welches als Parameter übergeben werden soll
  sckt: TSocket;

begin
  // Parameter vorbereiten
  arg := @sckt;
  // Thread mit dem Parameter starten
  BeginThread(nil, 0, TFNThreadStartRoutine(@ThreadFunk), arg, 0, ThreadID);
end;
Danke für alle Antworten schon mal im vorraus
engel90

sirius 6. Feb 2008 19:41

Re: Korrekte Typumwandlung nach TSocket
 
TSocket ist ein ganz normaler 32bit-Wert genauso wie ien Pointer. Hier reicht ein einfacher Typecast.

Delphi-Quellcode:
function ThreadFunk(client: TSocket): Longint; stdcall;

...

BeginThread(nil, 0, TFNThreadStartRoutine(@ThreadFunk), pointer(sckt), 0, ThreadID);

engel90 6. Feb 2008 19:54

Re: Korrekte Typumwandlung nach TSocket
 
danke :dp:

mfg
engel

engel90 6. Feb 2008 21:07

Re: Korrekte Typumwandlung nach TSocket
 
Zitat:

Zitat von sirius
TSocket ist ein ganz normaler 32bit-Wert genauso wie ien Pointer. Hier reicht ein einfacher Typecast.

Delphi-Quellcode:
function ThreadFunk(client: TSocket): Longint; stdcall;

...

BeginThread(nil, 0, TFNThreadStartRoutine(@ThreadFunk), pointer(sckt), 0, ThreadID);

wenn ich innerhalb des Threads die Funktion recv() aus der WinSock.pas aufrufe kommt als Fehlermeldung immer "Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist". Ich habe die Funktion folgendermaßen aufgerufen:
Delphi-Quellcode:
recBytes := Recv(clients, buff, SizeOf(buf), 0);

Muetze1 7. Feb 2008 00:20

Re: Korrekte Typumwandlung nach TSocket
 
Mit anderen Worten: "clients" enthält kein Sockethandle.

sirius 7. Feb 2008 07:50

Re: Korrekte Typumwandlung nach TSocket
 
Hast du mal überprüft, ob der Inhalt der Variablen (sckt und client) identisch ist? Sollte eigentlich funktionieren.

Und die Funktion Socket (und evtl. bind/connect) hast du auch aufgerufen.

engel90 7. Feb 2008 08:18

Re: Korrekte Typumwandlung nach TSocket
 
Zitat:

Zitat von sirius
Hast du mal überprüft, ob der Inhalt der Variablen (sckt und client) identisch ist? Sollte eigentlich funktionieren.

Und die Funktion Socket (und evtl. bind/connect) hast du auch aufgerufen.

Zum überprüfen hab ich einfach an den Anfang der Threadfunktion folgendes geschrieben:
Delphi-Quellcode:
  EnterCriticalSection(mutex_state);
  if (client = sckt) then begin
    Writeln('parameter und orginal gleich');
  end;
LeaveCriticalSection(mutex_state);
Dabei kommt heraus, das die Handles client und sckt nich gleich sind. Die Funktionen WSAStartUp(), Socket(), Bind(), und Listen() wurden erfolgreich ausgeführt.

mfg
engel

sirius 7. Feb 2008 08:21

Re: Korrekte Typumwandlung nach TSocket
 
AHHHH!
Nimm mal das stdcall hinter deiner Threadfunktion weg! Du benutzt doch Beginthread.

Edit: Ein einfacher Breakpoint hätte es auch getan :zwinker:

engel90 7. Feb 2008 08:28

Re: Korrekte Typumwandlung nach TSocket
 
Zitat:

Zitat von sirius
AHHHH!
Nimm mal das stdcall hinter deiner Threadfunktion weg! Du benutzt doch Beginthread.

Edit: Ein einfacher Breakpoint hätte es auch getan :zwinker:

Alles klar hat funktioniert :-D

Herzlichen Dank

mfg
engel


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz