![]() |
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:
Danke für alle Antworten schon mal im vorraus
...
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; engel90 |
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); |
Re: Korrekte Typumwandlung nach TSocket
danke :dp:
mfg engel |
Re: Korrekte Typumwandlung nach TSocket
Zitat:
Delphi-Quellcode:
recBytes := Recv(clients, buff, SizeOf(buf), 0);
|
Re: Korrekte Typumwandlung nach TSocket
Mit anderen Worten: "clients" enthält kein Sockethandle.
|
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. |
Re: Korrekte Typumwandlung nach TSocket
Zitat:
Delphi-Quellcode:
Dabei kommt heraus, das die Handles client und sckt nich gleich sind. Die Funktionen WSAStartUp(), Socket(), Bind(), und Listen() wurden erfolgreich ausgeführt.
EnterCriticalSection(mutex_state);
if (client = sckt) then begin Writeln('parameter und orginal gleich'); end; LeaveCriticalSection(mutex_state); mfg engel |
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: |
Re: Korrekte Typumwandlung nach TSocket
Zitat:
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