Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi EIdNotASocket - Socket OPeration on non Socket??? (https://www.delphipraxis.net/147843-eidnotasocket-socket-operation-non-socket.html)

delphifan2004 17. Feb 2010 13:05


EIdNotASocket - Socket OPeration on non Socket???
 
Hallo,

Ich experimentiere mit Indy und erhalte die im Threadtitel bezeichnete Exception. Gibt es dafür einen Workarond, der den Socket bekannt macht? Kann ich irgendwie mit indys einen Socket bereit stellen?

sirius 17. Feb 2010 13:06

Re: EIdNotASocket - Socket OPeration on non Socket???
 
Was hast du denn gemacht?

delphifan2004 17. Feb 2010 13:32

Re: EIdNotASocket - Socket OPeration on non Socket???
 
Tja, wenn ich das mir aufgeschrieben hätte, wie ich den Client-Quelltext verändert habe, könnte ich mehr sagen. :wall:

Deswegen will ich mal gleich anders fragen, falls mir sowas wieder passiert:

Welche Aufgabe hat der Socket im Netzwerk und wo gibt es nähere Infos dazu?

Habe in den Turbo Delphi Quellen die Unit ScktComp.pas gefunden.

Aber es gibt da die Klassen:

TClientWinSocket

TServerClientWinSocket

TServerWinSocket

Wozu sind die da?

Kann ich die irgendwie so einbinden, das der Soket Fehler nicht mehr auftritt und das Netzwerk robuster gegen Fehleingaben wird? Will das gerne verstehen, was da im Hintergrund vorgeht. Ist ja schön, das per Indy normalerweise eine Verbindung zwischen Client und Server mit wenigen Quelltextzeilen gelingt. Aber was geht da in den Tiefen des Rechners vor?

sirius 18. Feb 2010 10:42

Re: EIdNotASocket - Socket OPeration on non Socket???
 
Ein Socket ist quasi das Objekt auf Betriebssystemebene, welche die Kommunikation organisiert. Dem Socket kann man bestimmte Eigenschaften zuweisen (welcher Typ, welches Protokoll, etc.), man kann dem Socket sagen, dass es etwas absenden soll und wohin und man kann schauen, ob der Socket etwas in seinem Empfangspuffer liegen hat. usw usf.

Unter Windows sieht das folgendermaßen aus:
Delphi-Quellcode:
//stark gekürzt
uses WinSock;
var s:TSocket; // =Integer
begin
  s:=socket(Af_Inet,Sock_DGRAM,IPProto_UDP); //Socket initialisieren/einrichten


  sendto(s,buf,buflen,addr,addrsize); //Inhalt von Buf an Addr über socket s senden.
Neben sendto gibt es natürlich noch andere Befehle, wie recvfrom oder select. Bei allen musst du am Anfang ein Sockethandle (hier: s) übergeben. Wenn du das nicht machst, bekommst du eben deinen oben genannten Fehler.



Was bedeutet dies für dein Problem.
1. Du musst für die Nutzung von Indy nicht die WinAPI Befehle lernen, die ich u.a in dem Code oben gepostet habe,
2. du musst auch nicht die ScktComp dir ansehen, wenn du mit Indy arbeitest
3. Indy arbeitet intern mit genau dem, was ich dir oben angegeben habe (und natürlich auch die SocktComp). Du hast also bei der Bedienung von Indy etwas falsch gemacht. Deswegen sollst du mal zeigen, was du gemacht hast.

delphifan2004 18. Feb 2010 13:05

Re: EIdNotASocket - Socket OPeration on non Socket???
 
Hallo Sirius!

Da will ich mal den Quelltext für den Client hier rein stellen.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdGlobal, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    ComboBox2: TComboBox;
    Memo1: TMemo;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ComboBox2CloseUp(Sender: TObject);
    procedure ComboBox1CloseUp(Sender: TObject);
  private
    { Private-Deklarationen }
    TCPClient: TIdTCPClient;
    procedure ClientInit;
    procedure ClientExit;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TCPClient.Connect;
  {
  if TCPClient.Connected then begin
    TCPClient.IOHandler.WriteLn('$help target');
    TCPClient.Disconnect;
  end;
  }
end;

procedure TForm1.ClientInit;
begin
  TCPClient := TIdTCPClient.Create(self);
  with TCPClient do begin
    ConnectTimeout := 5000;           //Limit vorgeben, damit Server reagieren kann
    TCPClient.Host := ComboBox1.Text;
    IPVersion := Id_IPv4;
    Port := StrToInt(ComboBox2.text);
    ReadTimeout := 500;               //Limit für Lesen, ich nehme an, von Servernachrichten
  end;
end;

procedure TForm1.ClientExit;
begin
  TCPClient.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientInit;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientExit;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TCPClient.Disconnect;
end;

//IP Adresse Ändern
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  TCPClient.Host := ComboBox1.Text;
end;


//Kommando an den Server übergeben, wenn Verbindung Ok.
procedure TForm1.Button3Click(Sender: TObject);
var LastCmd: Integer;
begin
  LastCmd := Memo1.Lines.Count;
  if TCPClient.Connected then
  begin
    if LastCmd>0 then
    TCPClient.IOHandler.WriteLn(Memo1.Lines.Strings[LastCmd-1]);
  end;
end;


//Port einstellen -> Vorgabe 50000
procedure TForm1.ComboBox2CloseUp(Sender: TObject);
begin
  TCPClient.Port := StrToInt(ComboBox2.text);
  ShowMessage('Neuer Port'+IntToStr(TCPClient.Port));
end;

//IP Adresse einstellen -> Vorgabe 127.0.0.1 -> Eistellbar-> eigene IP,
//derzeit auch im LAN automatisch vergeben. Habe diese automatisch vorgegebene IP Adresse
//verwendet
procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
  TCPClient.Host := ComboBox1.Text;
  ShowMessage('Neuer Host: '+TCPClient.Host);
end;

end.
Eigenartigerweise klappt die Verbindung, wenn ich mit den Indy einen Server baue und mich damit verbinde. Wenn ich aber einen externen Server anwählen will, klappt das nicht.

Der externe Server (einer der nicht mit Indy programmiert ist), schlägt die Verbindung fehl. Was muss ich also machen, damit ich mich mit jedem beliebigen Server verbinden kann, egal ob dieser auf einem entfernten Rechner oder auf meinem lokalen PC läuft. Zuerst mal soll es aber auf dem lokalen Rechner klappen.

sirius 18. Feb 2010 13:18

Re: EIdNotASocket - Socket OPeration on non Socket???
 
Wann kommt der Fehler?

Bist du dir sicher, dass der andere Server deine Anfrage überhaupt annimmt?

Und es ist völlig egal, welche Socketkomponenten man nimmt. Indy muss funktionieren.

delphifan2004 18. Feb 2010 13:59

Re: EIdNotASocket - Socket OPeration on non Socket???
 
Zitat:

Zitat von sirius
Wann kommt der Fehler?

Bist du dir sicher, dass der andere Server deine Anfrage überhaupt annimmt?

Und es ist völlig egal, welche Socketkomponenten man nimmt. Indy muss funktionieren.

Nein, ich bin mir da nicht sicher, denn sonst käme ja wahrscheinlich der Connection Refused Error nicht.

Aber was kann ich machen, damit der Fehler nicht mehr auftritt?

Ich bin mir nicht mal mehr sicher, ob ich überhaupt die richtigen Windows XP Netzwerkeistellungen verwende. Gibt es da vielleicht etwas, was ich beachten muss?

Ich kann schon mal mit Sicherheit sagen, das der Indy-Server die Verbindung annimmt. Aber bei anderen Servern bin ich mir halt nicht sicher, weil ja da der Connectio refused Error kommt.

Der Fehler kommt, wenn ich die Verbindung aufbauen will, wenn ich faktisch den "Button1" in meinem Client geklickt habe.

sirius 19. Feb 2010 11:16

Re: EIdNotASocket - Socket OPeration on non Socket???
 
[quote="delphifan2004"]
Zitat:

Zitat von sirius
Ich bin mir nicht mal mehr sicher, ob ich überhaupt die richtigen Windows XP Netzwerkeistellungen verwende. Gibt es da vielleicht etwas, was ich beachten muss?

Eigentlich nicht. Aber wenn du dir unsicher bist, solltest du mal einen sicheren Client nehmen. Da gibt es irgendwie Programme im Netz zum Testen (hab ich mal hier in der DP gelesen ;) ).

Zitat:

Ich kann schon mal mit Sicherheit sagen, das der Indy-Server die Verbindung annimmt. Aber bei anderen Servern bin ich mir halt nicht sicher, weil ja da der Connectio refused Error kommt.
Das ist ja ein ganz anderer Fehler, als der eingangs erwähnte :wiejetzt:

delphifan2004 19. Feb 2010 13:57

Re: EIdNotASocket - Socket OPeration on non Socket???
 
[quote="sirius"]
Zitat:

Zitat von delphifan2004
Zitat:

Zitat von sirius
Ich bin mir nicht mal mehr sicher, ob ich überhaupt die richtigen Windows XP Netzwerkeistellungen verwende. Gibt es da vielleicht etwas, was ich beachten muss?

Eigentlich nicht. Aber wenn du dir unsicher bist, solltest du mal einen sicheren Client nehmen. Da gibt es irgendwie Programme im Netz zum Testen (hab ich mal hier in der DP gelesen ;) ).

Zitat:

Ich kann schon mal mit Sicherheit sagen, das der Indy-Server die Verbindung annimmt. Aber bei anderen Servern bin ich mir halt nicht sicher, weil ja da der Connectio refused Error kommt.
Das ist ja ein ganz anderer Fehler, als der eingangs erwähnte :wiejetzt:

Ist auch nicht mehr schlimm. Hab mein Problem per Console über Pipes gelöst. :wiejetzt:

Keine Ahnung, was da bei mir im Netzwerk falsch läuft. Nicht der Client war unsicher, sondern der Server, der übrigens auf dem entfernten Rechner auch nicht ansprechbar ist. Muss also was grundsätzliches mit den Netzwerkeinstellungen sein. Da ich mein Problem aber nun per Consolonkommunikation auch gelöst habe, ist das jetzt egal! :chat:


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