AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi EIdNotASocket - Socket OPeration on non Socket???
Thema durchsuchen
Ansicht
Themen-Optionen

EIdNotASocket - Socket OPeration on non Socket???

Ein Thema von delphifan2004 · begonnen am 17. Feb 2010 · letzter Beitrag vom 19. Feb 2010
Antwort Antwort
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
266 Beiträge
 
Delphi 10.3 Rio
 
#1

EIdNotASocket - Socket OPeration on non Socket???

  Alt 17. Feb 2010, 13:05
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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 17. Feb 2010, 13:06
Was hast du denn gemacht?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
266 Beiträge
 
Delphi 10.3 Rio
 
#3

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

  Alt 17. Feb 2010, 13:32
Tja, wenn ich das mir aufgeschrieben hätte, wie ich den Client-Quelltext verändert habe, könnte ich mehr sagen.

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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 18. Feb 2010, 10:42
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
266 Beiträge
 
Delphi 10.3 Rio
 
#5

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

  Alt 18. Feb 2010, 13:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 18. Feb 2010, 13:18
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
266 Beiträge
 
Delphi 10.3 Rio
 
#7

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

  Alt 18. Feb 2010, 13:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

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

  Alt 19. Feb 2010, 11:16
[quote="delphifan2004"]
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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
266 Beiträge
 
Delphi 10.3 Rio
 
#9

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

  Alt 19. Feb 2010, 13:57
[quote="sirius"]
Zitat von delphifan2004:
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
Ist auch nicht mehr schlimm. Hab mein Problem per Console über Pipes gelöst.

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!
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:23 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