AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Korrekte Typumwandlung nach TSocket

Ein Thema von engel90 · begonnen am 6. Feb 2008 · letzter Beitrag vom 7. Feb 2008
Antwort Antwort
Benutzerbild von engel90
engel90

Registriert seit: 15. Jan 2007
Ort: Jena
38 Beiträge
 
Delphi 7 Personal
 
#1

Korrekte Typumwandlung nach TSocket

  Alt 6. Feb 2008, 20:28
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Korrekte Typumwandlung nach TSocket

  Alt 6. Feb 2008, 20:41
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);
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von engel90
engel90

Registriert seit: 15. Jan 2007
Ort: Jena
38 Beiträge
 
Delphi 7 Personal
 
#3

Re: Korrekte Typumwandlung nach TSocket

  Alt 6. Feb 2008, 20:54
danke

mfg
engel
  Mit Zitat antworten Zitat
Benutzerbild von engel90
engel90

Registriert seit: 15. Jan 2007
Ort: Jena
38 Beiträge
 
Delphi 7 Personal
 
#4

Re: Korrekte Typumwandlung nach TSocket

  Alt 6. Feb 2008, 22:07
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:
recBytes := Recv(clients, buff, SizeOf(buf), 0);
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Korrekte Typumwandlung nach TSocket

  Alt 7. Feb 2008, 01:20
Mit anderen Worten: "clients" enthält kein Sockethandle.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Korrekte Typumwandlung nach TSocket

  Alt 7. Feb 2008, 08:50
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von engel90
engel90

Registriert seit: 15. Jan 2007
Ort: Jena
38 Beiträge
 
Delphi 7 Personal
 
#7

Re: Korrekte Typumwandlung nach TSocket

  Alt 7. Feb 2008, 09:18
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Korrekte Typumwandlung nach TSocket

  Alt 7. Feb 2008, 09:21
AHHHH!
Nimm mal das stdcall hinter deiner Threadfunktion weg! Du benutzt doch Beginthread.

Edit: Ein einfacher Breakpoint hätte es auch getan
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von engel90
engel90

Registriert seit: 15. Jan 2007
Ort: Jena
38 Beiträge
 
Delphi 7 Personal
 
#9

Re: Korrekte Typumwandlung nach TSocket

  Alt 7. Feb 2008, 09:28
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
Alles klar hat funktioniert

Herzlichen Dank

mfg
engel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz