Autor |
Beitrag |
BigAl
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: Fr 30.09.11 11:03
Hallo zusammen,
ich kämpfe hier schon eine Zeit lang mit dem Problem, dass ich eine socket-Verbindung nicht öffnen kann. Folgender Quelltext (natürlich auf das Wesentliche gekürzt):
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:
| interface
uses ScktComp;
type XXX = class(TObject) private FSocket: TClientSocket; public constructor Create(AHost: string; APort: Integer); destructor ... end;
implementation
constructor XXX.Create(AHost: string; APort: Integer); begin inherited Create; FSocket := TClientSocket.Create(nil); FSocket.Host := AHost; FSocket.Port := APort; FSocket.Open; end; |
Sobald das Open aufgerüfen wird, wird eine Exception ausgelöst. Die Message der Exception ist "Can't create new socket".
Was läuft da falsch? Hat irgendwer eine Idee?
Vielen Dank schonmal.
Alex
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 30.09.11 11:11
Die WSA von Windows möchte ein Fenster für Verbindungen haben. Probier daher mal, einen Owner wie die Form zu übergeben statt nil. Außerdem: Hast Du zufällig eine Firewall aktiv?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
BigAl 
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: Fr 30.09.11 11:20
BenBE hat folgendes geschrieben : | Die WSA von Windows möchte ein Fenster für Verbindungen haben. Probier daher mal, einen Owner wie die Form zu übergeben statt nil. Außerdem: Hast Du zufällig eine Firewall aktiv? |
Vielen Dank für die Antwort. Fenster habe ich schon probiert (Application.MainForm anstelle von nil). Auch die Firewall hatte ich schon deaktiviert...
Mache ich eine neue Aplikation und setze da direckt die Komponente drauf, dann geht es problemlos... Mir gehen im Moment die Ideen aus  .
Nachtrag: Es ist sogar noch schlimmer als ich dachte. Wenn ich den ganzen Code deaktiviere (betreffend des Sockets) und lediglich auf das Hauptformular einen ClientSocket setze, dann erhalte ich sofort die Meldung "Can't create client socket"... Ich habe in der IDE den Socket auf aktiv gesetzt, damit er direkt beim Programmgestart geöffnet werden soll. Wie gesagt: mit einer neuen Applikation funktioniert alles einwandfrei...
Und noch ein Nachtrag: Wenn ich das Programm direkt starte (außerhalb der IDE) dann erhalte ich die Meldung "Windows Socket Error: Der angeforderte Name ist gültig, es wurden jedoch keine Daten des angeforderten Typs gefunden (11004), on API 'ASync Lookup'". Ich nutze das Delphi XE Enterprise...
Was kann das sein?
Alex
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 30.09.11 11:48
Wenn du den Socket direkt in der IDE auf aktiv setzt, dann ist die Verbindung bereits aktiv, wodurch er bereits an einen Port gebunden ist. Insbesondere bei Server-Sockets führt das gerne zu Problemen. Daher sollte man das Aktivieren immer im Code machen.
Auch hab ich die Vermutung, dass Du nicht Open, sondern Active:=True; im Source machen solltest.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
BigAl 
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: Fr 30.09.11 11:54
BenBE hat folgendes geschrieben : | Wenn du den Socket direkt in der IDE auf aktiv setzt, dann ist die Verbindung bereits aktiv, wodurch er bereits an einen Port gebunden ist. Insbesondere bei Server-Sockets führt das gerne zu Problemen. Daher sollte man das Aktivieren immer im Code machen.
Auch hab ich die Vermutung, dass Du nicht Open, sondern Active:=True; im Source machen solltest. |
Bringt alles nichts. Active := True wird ja in der TAbstractSocket.Open gemacht - sonst nichts. Die wird auch nicht überschrieben. Und aktiviert wird der Port innerhalb der IDE nicht (war glaube ich früher mal so). Mittlerweile steht in der Aktivierung ...and not (csDesigning in ComponentState) ....
Meine Applikation nutzt mehrere Socket-Verbindungen. Habe eben festgestellt, dass die alle nicht mehr funktionieren. Man könnte jetzt natürlich denken, dass es an der Umgebung liegt (Delphi XE, Win 7 64 bit usw.). Das Komische ist nur, dass es in einer neuen Applikation (auf dem gleichen System) ohne murren sofort geht...
Alex
|
|
BigAl 
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: Sa 01.10.11 09:14
Hi zusammen,
habe es mittlerweile soweit das es läuft - aber nur außerhalb der IDE (?). Solange ich das Programm in der IDE starte (Debug oder Release) erhalte ich die Meldung "Can't create new socket". Ich habe auch schon sämtliche Parameter einer kleinen Testapplikation (welche läuft) verglichen. Alles gleich...
Ich hatte schonmal ein ähnliches Problem (IDE-Abhängig) mit dem SDAC von Devart. Da lief der SQL-Monitor auch nur wenn die Applikation außerhalb der IDE gestartet wurde. Ich habe damals zusammen mit Devart nach dem Problem gesucht. Wir haben nichts gefunden. Erst als ich die Applikation neu angelegt und alle Teile von der ursprünglichen Applikation eingefügt hatte lief alles. Einfach die Applikation unter einem anderen Namen zu speichern und neu zu kompilieren hatte nichts gebracht...
Worin liegt der Unterschied beim Start einer Applikation aus bzw. ohne IDE? Speziell bei Build-Konfiguration "Release" sollte da doch kein Unterschied mehr sein...
Da ich recht umfangreiche Auswertungen der empfangenen Telegramme mache, sollte ich den Debugger haben. Ich sollte also irgendwie die Applikation innerhalb der IDE ans Laufen bekommen.
Hat irgendjemand noch Ideen was da sein könnte?
Alex
|
|
BigAl 
      
Beiträge: 31
XP, Vista, 7, 2000+ Server
RAD Studio XE / XE2 EP/Prof., C#, MSSQL, HTML, PHP, Step 7...
|
Verfasst: Di 04.10.11 09:56
Nachtrag:
Ich habe mittlerweile wieder alles am Laufen. Ich habe keine Ahnung wo der Fehler herkam (bzw. immer noch herkommt). Was habe ich gemacht:
1. Ich habe eine neue Applikation unter einem anderen Namen erzeugt, abgespeichert und dann Delphi beendet.
2. Ich habe alle Quelldateien (ohne die Projektdateien) in das neue Projekt kopiert.
3. Nachdem Delphi neu gestartet wurde habe ich alle Dateien manuell dem Projekt wieder hinzugefügt.
Wie schon bereits weiter oben erwähnt: Das Projekt (und somit die EXE) unter einem anderen Namen zu speichern brachte keinen Erfolg. Der Vorgang war in einer halben Stunde erledigt (es ist ein recht umfangreiches Projekt). Das gleiche Verfahren musste ich schonmal vor etwa einem Jahr anwenden als die Monitorschnittstelle von Devarts SDAC ihren Dienst verweigert. Irgendwo merkt sich Delphi da irgendwas, was man nicht in der Oberfläche konfigurieren kann. Das Betriebssystem schließe ich erstmal aus, da spätestens mit einem anderen EXE-Namen für Firewall und Co die Karten neu gemischt werden...
Gruß
Alex
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 04.10.11 11:20
Moin!
Markierst du den Thread noch entsprechend, wenn dein Problem gelöst ist? Danke.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|