![]() |
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? |
Re: EIdNotASocket - Socket OPeration on non Socket???
Was hast du denn gemacht?
|
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? |
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:
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.
//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. 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. |
Re: EIdNotASocket - Socket OPeration on non Socket???
Hallo Sirius!
Da will ich mal den Quelltext für den Client hier rein stellen.
Delphi-Quellcode:
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.
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. 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. |
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. |
Re: EIdNotASocket - Socket OPeration on non Socket???
Zitat:
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. |
Re: EIdNotASocket - Socket OPeration on non Socket???
[quote="delphifan2004"]
Zitat:
Zitat:
|
Re: EIdNotASocket - Socket OPeration on non Socket???
[quote="sirius"]
Zitat:
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 00:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz