Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Socket-Fehler #10054 (https://www.delphipraxis.net/99289-socket-fehler-10054-a.html)

xZise 10. Sep 2007 09:29


Socket-Fehler #10054
 
Ich bekomme, wenn ich eine Nachricht an eine Ip sende einen Socketfehler #10054, obwohl keine der beiden Seiten die Verbindung trennt.

Ich benutze die UdpSockUtil-Komponente, wessen Demo problemlos funktioniert.
Meine Frage ist nun, welchen Code ihr braucht um zu sagen, was ich falsch mache.
Delphi-Quellcode:
procedure TfrmMain.Send(AType: TMessageType; ARecipient: string; AIndex : Integer);
var
  Data : array of Byte;
  msg : TMessageData;
  i: Integer;
  kill : string;
  messageOkay : Boolean;
begin
  SetLength(Data, REQUEST_HEADER_LENGTH);
  messageOkay := true;
  case AType of
    mtShutDown: begin
      Data[0] := 1;
    end;
    mtLogOut: begin
      Data[0] := 2;
    end;
    mtDelete: begin
      Data[0] := 3;
    end;
    mtMessage: begin
      if frmDialog.Execute = mrOk then
      begin
        msg := frmDialog.GetMessageData;
        // Laenge der Nachricht erstellen
        // Es müssen zusätzlich noch 3 addiert werden, da es 2 Trenner gibt und ein Iconindex
        SetLength(Data, Length(msg.title + msg.text) + 3 + REQUEST_HEADER_LENGTH);
        Data[0] := 4;
        for i := 1 to Length(msg.title) do
          Data[i + REQUEST_HEADER_LENGTH - 1] := Ord(msg.title[i]);
        Data[Length(msg.title) + REQUEST_HEADER_LENGTH] := 0;
        for i := 1 to Length(msg.text) do
          Data[Length(msg.title) + i + REQUEST_HEADER_LENGTH] := Ord(msg.text[i]);
        Data[Length(msg.title + msg.text) + 2 + REQUEST_HEADER_LENGTH] := 0;
        Data[High(Data)] := msg.icon;
      end else
        messageOkay := false;
    end;
    mtKill: begin
      kill := 'IcyTower';

      if InputQuery('Kill', 'Bitte geben sie den Titel des Programms an, der beendet werden soll.', kill) then
      begin
        // Laenge der Nachricht erstellen
        SetLength(Data, Length(kill) + REQUEST_HEADER_LENGTH);
        Data[0] := 5;
        for i := 1 to Length(kill) do
          Data[i + REQUEST_HEADER_LENGTH - 1] := Ord(kill[i]);
      end else
        messageOkay := false;
    end;
  end;
  if messageOkay then
  begin
    if ARecipient = 'r50' then
    begin
      for i := 0 to High(R50_NAMES) do
      begin
        udpSocket.RemoteHost := R50_NAMES[i];
        udpSocket.SendBuf(Data[0], Length(Data));
      end;
    end else if ARecipient = 'foyer' then
    begin
      for i := 0 to High(R50_NAMES) do
      begin
        udpSocket.RemoteHost := 'Foyer' + IntToStr(i);
        udpSocket.SendBuf(Data[0], Length(Data));
      end;
    end else
    begin
      udpSocket.RemoteHost := ARecipient;
      udpSocket.SendBuf(Data[0], Length(Data));
    end;
  end;
end;
Das ist der Code, welche die Nachricht sendet.
ARecipent ist "192.168.1.191" (Ping erfolgreich), AType ist entweder 1 oder 2 (beides geht nicht)...
Dies tritt auch mit den anderen PCs auf.

Ich kommuniziere dabei über Prot 2007 zu einen Service.

Könnt ihr mir sagen was ich falsch mache xD

Kann es auch sein, dass ich den anderen Computer (also der mit den Service) herunterfahren/abmelden will?
(Naja ist Windows 2000... da funktioniert das nicht so ganz)

MfG
xZise

PS: Wenn ich eine Nachricht übertrage funktioniert es seltsamerweise :gruebel:

PPS: Wäre freundlich, wenn es jemand bis 11:10 sieht ^^ dann ist die Freistunde vorbei xD

Klaus01 10. Sep 2007 14:49

Re: Socket-Fehler #10054
 
Zitat:

Zitat von xZise
Ich bekomme, wenn ich eine Nachricht an eine Ip sende einen Socketfehler #10054, obwohl keine der beiden Seiten die Verbindung trennt.

< stuff deleted >

PS: Wenn ich eine Nachricht übertrage funktioniert es seltsamerweise :gruebel:

Hallo,

wo besteht denn der Unterschied zwischen Nachricht an eine IP senden und eine Nachricht übertragen?
Und ist UDP nicht ein verbindungsloses Protokoll und
es wird zwischen Client und Server keine Verbindung aufgebaut wie bei TCP?

Grüße
Klaus

Nils_13 10. Sep 2007 14:53

Re: Socket-Fehler #10054
 
#10054 heißt, dass du derb was vermasselt hast und eine Verbindung entweder nie aufgebaut wurde oder sofort wieder wegen einem Fehler wieder geschlossen wurde.

xZise 10. Sep 2007 15:13

Re: Socket-Fehler #10054
 
Zitat:

Zitat von Klaus01
wo besteht denn der Unterschied zwischen Nachricht an eine IP senden und eine Nachricht übertragen?

Genau, dass ist ja das seltsame... die Befehle "Shutdown" und "Abmelden" erzeugen den Fehler, aber eine MessageBox übertragen erzeugt kein Fehler.

Zitat:

Zitat von Klaus01
Und ist UDP nicht ein verbindungsloses Protokoll und
es wird zwischen Client und Server keine Verbindung aufgebaut wie bei TCP?

Jap? Und weiter?

Zitat:

Zitat von Nils_13
#10054 heißt, dass du derb was vermasselt hast und eine Verbindung entweder nie aufgebaut wurde oder sofort wieder wegen einem Fehler wieder geschlossen wurde.

Hmmm... Okay... dann gucken wir mal, was den die Verbindung sofort wieder schließt... das ist ehm. moment... ich finds nicht... (und es ist kein Allgemeines Problem wie z.B. Firewall).
Und warum sollte keine Verbindung aufgebaut werden?

Kann es sein (wie im 1. Post schon vermutet), es damit zusammenhängt dass ich Exit_Win beim Service aufrufe?

Klaus01 10. Sep 2007 15:29

Re: Socket-Fehler #10054
 
Zitat:

Zitat von "xZise
Kann es sein (wie im 1. Post schon vermutet), es damit zusammenhängt dass ich Exit_Win beim Service aufrufe?

Nun, wenn Du den Rechner auf dem der Server sitzt während der Kommunikation herunterfährst werden auch die UDP Ports geschlossen/bzw. der Server-Dienst abgeschaltet. Und dann dürfte keine Kommunikation mehr möglich sein und zu diesem
Fehler führen.

Ich finde es sehr schwer Deinen Ausführungen zu folgen wenn man Dein Programm nicht kennt.

Grüße
Klaus

xZise 10. Sep 2007 17:52

Re: Socket-Fehler #10054
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay :) Dann werde ich wohl nicht drum herumkommen :)
Ich werde mal den Code veröffentlichen... Es gibt 2 Komponenten (Service & "(Admin)Tool").

Ein paar Hinweise: 1. Das Tool benutzt neuerdings (diese Version nicht) IP Adressen anstelle der Computernamen.
2. Der Service sollte (falls ihr ihn installiert), neukompiliert werden

xZise 15. Sep 2007 14:01

Re: Socket-Fehler #10054
 
So, ich habevor 5 Tagen den Code online gestellt ;) Und der Fehler ist immernoch vorhanden.
Abgesehen davon, dass der Service Windows 2000 eh nicht korrekt runterfährt (Der Dienst läuft weiter => Nachrichten werden angezeigt)

xZise 25. Sep 2007 11:26

Re: Socket-Fehler #10054
 
Ich will ja nicht nerven, aber es kann doch nicht sein, dass niemand eine Antwort auf dieses Problem hat?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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