AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Drucken im Netzwerk mit TidLpr: "Socket already in use"
Thema durchsuchen
Ansicht
Themen-Optionen

Drucken im Netzwerk mit TidLpr: "Socket already in use"

Ein Thema von skyobserver · begonnen am 5. Jan 2010 · letzter Beitrag vom 9. Mär 2010
Antwort Antwort
Seite 2 von 2     12   
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#11

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 9. Jan 2010, 13:26
Hallo skyobserver,

Zitat von skyobserver:
Die Idee hatte ich auch schon...dann bekomme ich beim zweiten
Druck zwar keine Fehlermeldung aber auch keinen Ausdruck und
das Programm friert ein...
Hmm, ich habe das mal zur Prüfung weitergeleitet, vielleicht hat jemand noch eine Idee. Auf jeden Fall ist es bekannt: Das auch Dein Dos-Tool schnell fehlschlägt zeigt ja das grundsätzliche Problem aber auf, also ist es nicht Indy-Spezifisch.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#12

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 9. Jan 2010, 18:04
Hallo skyobserver,

probier mal bitte folgendes, um die Beschränkung der RFC 1179 zu umgehen:

Delphi-Quellcode:
IdLPR1.Host := 'brn_906b9b';
IdLPR1.Queue := 'BINARY_P1';

IdLPR1.BoundPortMin := 512;
IdLPR1.BoundPortMax := 1024;
IdLPR1.BoundPort := IdLPR1.BoundPortMin;

while (not IdLPR1.Connected) and (IdLPR1.BoundPort <= IdLPR1.BoundPortMax) do
begin
  try
    IdLPR1.Connect;
  except
    On E: EIdSocketError do
    begin
      if E.LastError = 10048 then // Socket already in use...
        IdLPR1.BoundPort := IdLPR1.BoundPort + 1
      else
        raise;
    end;
    On E: Exception do
      raise;
  end;
end;

if IdLPR1.Connected then
begin
  IdLPR1.PrintFile('D:\temp.prn');
  IdLPR1.Disconnect;
end
else
  ShowMessage('Fehler beim Versenden des Printfiles');
Das ist zwar nicht schön und nicht schnell bei vielen Druckaufträgen, sollte aber funktionieren. Sobald dann die ersten Ports in der Range wieder frei werden (die 60-120 Sekunden), wird beim nächsten Auftrag wieder ein kleinerer Port genommen.

Eine Abbruchmöglichkeit und Fehlerprüfung solltest Du noch einbauen, aber Du hast schonmal eine Idee davon.

Edit: Die Exception wirst Du in der IDE trotzdem noch sehen, also bitte entsprechend steuern & testen.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#13

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 10. Jan 2010, 15:33
Hallo skyobserver,

Zitat von Assertor:
probier mal bitte folgendes, um die Beschränkung der RFC 1179 zu umgehen
Mir ist noch was eingefallen, da die 10048 nicht im Bind sondern im Connect geraist wird.

Überlass mal Windows die lokale Port Zuweisung, dann solltest Du nicht so schnell als Limit kommen:

Delphi-Quellcode:
IdLPR1.Host := 'brn_906b9b';
IdLPR1.Queue := 'BINARY_P1';

IdLPR1.BoundPortMin := 0;
IdLPR1.BoundPortMax := 0;
IdLPR1.BoundPort := 0;

IdLPR1.Connect;
try
  IdLPR1.PrintFile('meinfile.prn');
finally
  IdLPR1.Disconnect;
end;
Gerade testest, geht auch schnell hintereinander. Ohne die langsamen Exceptions.

Hinweis: Das klappt nur, wenn der LPR keine bestimmte Client-Port-Range voraussetzt, wobei dies seit vielen Jahr überlicherweise kein Problem mehr ist.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 18. Jan 2010, 23:32
Zitat von Assertor:
Hallo skyobserver,

Zitat von Assertor:
probier mal bitte folgendes, um die Beschränkung der RFC 1179 zu umgehen
Mir ist noch was eingefallen, da die 10048 nicht im Bind sondern im Connect geraist wird.

Überlass mal Windows die lokale Port Zuweisung, dann solltest Du nicht so schnell als Limit kommen:

Delphi-Quellcode:
IdLPR1.Host := 'brn_906b9b';
IdLPR1.Queue := 'BINARY_P1';

IdLPR1.BoundPortMin := 0;
IdLPR1.BoundPortMax := 0;
IdLPR1.BoundPort := 0;

IdLPR1.Connect;
try
  IdLPR1.PrintFile('meinfile.prn');
finally
  IdLPR1.Disconnect;
end;
Gerade testest, geht auch schnell hintereinander. Ohne die langsamen Exceptions.

Hinweis: Das klappt nur, wenn der LPR keine bestimmte Client-Port-Range voraussetzt, wobei dies seit vielen Jahr überlicherweise kein Problem mehr ist.

Gruß Assertor

Hallo,

ich habe bisher noch nie was mit der Indy Komponente gearbeitet. Ich habe bei mir die IdLPR Komponente auf Form geklatscht. Bei den Versuch den obigen Code unter Delphi 2007 auszuführen kennt mein Delphi einige Befehle wie z.B."IdLPR1.Host" nicht.

Benötigt man dafür noch spezielle Units?

Lg,
jus
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 19. Jan 2010, 20:06
Hallo,

für diejenigen, wie ich, die verzweifelt diesen Code unter Delphi 2007 nicht zum Laufen gebracht haben, weil die mitgelieferte Indy Komponente viele Befehle wie z.B. "IdLPR1.Host",.... nicht kennt.
Den entscheidenden Hinweis brachte erst nach einer mühsamen Internet Recherche folgendes Forum:
https://forums.codegear.com/message....ssageID=148883

Ich habe erst zum Laufen gebracht, nachdem ich die alte Indy deinstalliert habe und die neueste Indy Version in Delphi installiert habe. Ich habe mir die "IndyTiburon.zip" runtergladen.



Lg,
jus
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#16

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 19. Jan 2010, 20:47
Hallo jus,

Zitat von jus:
Hallo,

für diejenigen, wie ich, die verzweifelt diesen Code unter Delphi 2007 nicht zum Laufen gebracht haben, weil die mitgelieferte Indy Komponente viele Befehle wie z.B. "IdLPR1.Host",.... nicht kennt.
Den entscheidenden Hinweis brachte erst nach einer mühsamen Internet Recherche folgendes Forum:
https://forums.codegear.com/message....ssageID=148883

Ich habe erst zum Laufen gebracht, nachdem ich die alte Indy deinstalliert habe und die neueste Indy Version in Delphi installiert habe. Ich habe mir die "IndyTiburon.zip" runtergladen
Danke für die Aufklärung! Ich habe nicht bedacht, das dieser Thread auch von Indy-Neulingen gelesen werden würde - und war nicht schnell genug Deinen Post rechtzeitig zu lesen und Dir zu helfen...

Der Vollständigkeit halber: Unter der alten Indy Version gab es m.E. TIdLPR.Connect('Host'), das hätte die Delphi Code-Vervollständigung der IDE anzeigen müssen...

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 20. Jan 2010, 10:19
Hallo Assertor,

trotzdem vielen Dank fürs antworten!

Lg,
jus
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#18

Re: Drucken im Netzwerk mit TidLpr: "Socket already in

  Alt 9. Mär 2010, 22:01
Hallo,

nachdem ich hier seinerzeit eine Lösung präsentiert hatte, habe ich den Punkt immer mal wieder aufgegriffen und nun zusammen mit Remy Lebeau eine allgemeine Lösung direkt in Indy implementiert. O.g. Lösungsansatz (BoundPortMin und Max auf 0) ist mit neuem SVN also nicht mehr nötig.

Problemursache ist, dass trotz Verzicht auf eine Wildcard-IP (BoundIP ist gesetzt) der Windows Socket nicht im Bind(), sondern im Connect() einen Fehler (WSAEADDRINUSE) meldet. Dies entspricht nicht dem Dokumentierten Verhalten aus dem MSDN und ist mal wieder ein Windows-spezifischer Sonderfall

Gruß,
Assertor
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:36 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