| Autor |
Beitrag |
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mi 06.09.06 17:40
hi,
ich möchte mir gerne eine Unit schreiben, inder ich einen UDP Server und Clienten drin habe. Dort möchte ich gerne ein eigenen Protokoll entwerfen, damit ich nicht im jedem Netzwerkprogramm immer wieder alles neu einhacken muss.
Nun müsste ich den Server und den Clienten ja mehr oder weniger Dynamisch erzeugen, und genau da fängt es schon wieder an, ich komme einfach nicht weiter
Ich habe bis jetzt folgendes probiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| unit UtNetzwerk;
interface uses IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;
type TIdSocketHandle = THandle;
type tnetzwerk = class(tobject) private var client:TIdUDPClient; public function init(port:integer):integer; end;
implementation
function tnetzwerk.init(port:integer):integer; begin client:= TIdUDPClient.Create(client); client.Port:=port; end; end. |
Und alles was mir als Fehlermeldung ausgeworfen wird ist folgendes:
| Fehlermeldung hat folgendes geschrieben: |
---------------------------
Project1
---------------------------
Zugriffsverletzung bei Adresse 0045C774 in Modul 'Project1.exe'. Lesen von Adresse 00000004.
---------------------------
OK
--------------------------- |
ich habe schon raisgefunden, dass es an dieser Zeile liegt:
Delphi-Quelltext 1:
| client:= TIdUDPClient.Create(client); |
Ich denke mal es liegt an dem Parameter den ich dort eingesetzt habe, leider weiß ich nicht was ich noch dafür einsetzten sollte...
Kann mir jemand vllt auf die Sprünge helfen?
thx hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Do 07.09.06 22:24
ok das obige prob hat sich erledigt... musste das ganze als Globale Variable in der Unit deklarieren, das erstellen geht nun also....doch nun habe ich ein weiteres Prob was ich hier gleich anfügen möchte:
nun möchte ich gerne folgendes realisieren:
Delphi-Quelltext 1:
| server.OnUDPRead:= ServerRead; |
dazu habe ich folgendes bis jetzt zusammengebastelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| type tnetzwerk = class(tobject) private procedure ServerRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); public function init(port:integer):integer; end;
function tnetzwerk.init(port:integer):integer; begin server:= TIdUDPServer.Create(Server); server.DefaultPort:=port; server.active:= true; server.OnUDPRead:= OnUDPRead; client:= TIdUDPClient.Create(client); client.Port:=port; end;
procedure tNetzwerk.ServerRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var msg:string; begin AData.Position:=0; SetLength(msg,AData.Size); AData.ReadBuffer(msg[1],AData.Size); showmessage(msg); end; |
Leider wirft mir der Compiler folgendes an den Kopf:
| Compiler hat folgendes geschrieben: | | [Fehler] UtNetzwerk.pas(50): E2010 Inkompatible Typen: 'TIdSocketHandle' und 'Cardinal' |
Dabei hat die Procedure OnUDPRead exakt die gleichen Parameter als wenn ich die Komponente auf eine Form packen würde, warum also bekomme ich diese Meldung? Kann mir jemand vllt. n Tipp geben?
danke hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mo 11.09.06 16:19
*push* 
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
ManniTwo
      
Beiträge: 46
Win XP SP III, Ubuntu 8.04, Debian 5.0
Delphi 5 Pro; Delphi 2005; C++,C# (VS 2005); Java, Ruby (Eclipse)
|
Verfasst: Mo 11.09.06 16:47
hi,
also zunächst mal ist diese zeile merkwürdig:
Delphi-Quelltext 1:
| server.OnUDPRead:= OnUDPRead; |
da müsste auf der rechten Seite IMHO "ServerRead" stehen, so wie du es weiter oben in deinem Post beschrieben hast.
Vielleicht war das ja schon der Fehler, ansonsten sehe ich im Augenblick auch nichts.
Was ich allerdings zusätzlich merkwürdig finde (was aber mit deinem konkreten Problem nichts zu tun hat) ist , dass du dem Konstruktor das zu instanzierende Objekt übergibst, also:
Delphi-Quelltext 1:
| client:= TIdUDPClient.Create(client); |
das solltest du vielleicht auch noch einmal überprüfen
_________________ Wer andern eine Bratwurst brät, der hat ein Bratwurst-Brat-Gerät, oder anders:
Delphi-Quelltext 1:
| if Self.BraetAndernEineBratwurst then Self.HasBratwurstBratGeraet := true; |
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mo 11.09.06 20:37
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.09.06 20:57
Moin!
hibbert hat folgendes geschrieben: | | und was sollte ch deiner Meinung nach da ändern? Der Compiler merkert da zumindest nicht... |
Nimm NIL.
Und ich schätze, der Fehler liegt hier:
hibbert hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit UtNetzwerk;
interface uses IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;
type TIdSocketHandle = THandle;
type tnetzwerk = class(tobject) | |
In meiner Doku ist das aber so deklariert:
TIdSocketHandle = class(TCollectionItem)
Und das passt auch zu der Fehlermeldung (Cardinal, was THandle ist).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mo 11.09.06 21:36
hi,
danke erstmal für die hinweise
ich habe jetzt n paar kleine änderungen gemacht, aber sag mal, hab ich n brett vorm kopf oder so was ähnliches?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| type TIdSocketHandle = class(TCollectionItem);
type tnetzwerk = class(tobject) private procedure ServerRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); public function init(port:integer):integer; procedure dest; end;
implementation
procedure tNetzwerk.ServerRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); begin end;
function tnetzwerk.init(port:integer):integer; begin server:= TIdUDPServer.Create(nil); server.DefaultPort:=port; server.active:= true; server.OnUDPRead:= ServerRead; client:= TIdUDPClient.Create(nil); client.Port:=port; end; |
| Der Compiler hat folgendes geschrieben: | [Fehler] UtNetzwerk.pas(4 : E2010 Inkompatible Typen: 'IdSocketHandle.TIdSocketHandle' und 'UtNetzwerk.TIdSocketHandle' |
Wie soll ich denn nu das schonwieder verstehn?
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.09.06 22:08
Moin!
hibbert hat folgendes geschrieben: | | Der Compiler hat folgendes geschrieben: | [Fehler] UtNetzwerk.pas(4 : E2010 Inkompatible Typen: 'IdSocketHandle.TIdSocketHandle' und 'UtNetzwerk.TIdSocketHandle' |
Wie soll ich denn nu das schonwieder verstehn?  |
Na, so wie es da steht?
Ist denn die Idee so abwegig, dass die Indies gerne ihr eigenes Socket-Handle hätten und du deshalb uses ..., IdSocketHandle; hinzufügen mußt?  (ist doch praktisch eine Typenkollision)
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mo 11.09.06 23:41
moin,
ich habe es mal geändert und siehe da....
Delphi-Quelltext 1:
| uses IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,classes,IdUDPServer,dialogs,IdSocketHandle; |
| Der Compiler hat folgendes geschrieben: | | [Fehler] UtNetzwerk.pas(52): E2010 Inkompatible Typen: 'IdSocketHandle.TIdSocketHandle' und 'UtNetzwerk.TIdSocketHandle' |
...  noch immer der gleiche fehler. Ich habe sonst nichts weiter verändert...
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 12.09.06 00:02
Moin!
Roh aus deinem Code zusammengehackt, aber geht durch den Compiler:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| unit Unit2;
interface
uses Classes, IdSocketHandle, IdUDPServer, IdUDPClient;
type tnetzwerk = class(tobject) private procedure ServerRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); public function init(port:integer):integer; end;
var server: TIdUDPServer; client: TIdUDPClient;
implementation
procedure tNetzwerk.ServerRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); begin end;
function tnetzwerk.init(port:integer):integer; begin server:= TIdUDPServer.Create(nil); server.DefaultPort:=port; server.active:= true; server.OnUDPRead:= ServerRead; client:= TIdUDPClient.Create(nil); client.Port:=port; end;
end. |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 12.09.06 01:22
hmmm ok, ich danke dir.
Ich habe einmal deinen Vorschlag versucht und funktioniert auch.
Dann habe ich bei meinem Quelltext mal nachgeforscht und habe festgestellt, dass es die ganze zeit an dieser Deklaration gelegen hat:
Delphi-Quelltext 1: 2:
| type TIdSocketHandle = class(TCollectionItem); |
oder Delphi-Quelltext 1: 2:
| type TIdSocketHandle = Thandle; |
naja nun funktioniert es endlich, danke für die hilfe.
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
|