PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sockets & Timeout


SelFi
11.02.2002, 14:33
Hi,

Ich habe ein Problem. Ich will bei einem client zum connect ein timeout hinzufügen, damit er auf die antwort eine vorgegebene zeit wartet, doch habe ich bis jetzt nur schrott im netz gefunden:(.würde mich freuen wenn mir einer von euch sagen könnte ich ich´s realisieren kann.
Gruß SelFi


Felix Kaiser
11.02.2002, 15:40
In einen Tcp/Ip Socket bekommst du hinterher kein Timeout mehr rein. Jedoch bei einem UdpSocket hast du gute Chancen. Bei einem UdpSocket öffnest du einfach den Socket und du kannst abfragen ob er noch versucht zu verbinden oder ob er bereits verbunden ist. Mit Hilfe eines Timers kannst du ein Timeout festlegen, nach welchem du dann den Verbindungsvorgang abbrichst.

SelFi
11.02.2002, 16:27
hmm sicher das ich ihm vor dem connect nicht sagen kann wie lange er wartet bis er den sock wieder closed ?

Felix Kaiser
11.02.2002, 17:35
Tcp/Ip Sockets bieten weder im C++ Builder noch in Delphi, noch in PHP, noch in mIRC Scripting [...] ein Timeout. Machs doch so: Checke mit nem UdpSocket ob du eine Verbindung z.B. innerhalb von 5 Sek zu einem Server aufbauen kannst. Wenn das innerhalb von 5 Sek via Udp geklappt hat kannst davon ausgehen, dass du ohne größere Verzögerung sofort via Tcp/Ip dorthin connecten kannst, vorrausgesetzt du weißt, dass der Server Tcp/Ip fähig ist ;)

SelFi
11.02.2002, 17:48
hm ok danke :))

Baegsch
12.02.2002, 00:55
Original von Guru
Checke mit nem UdpSocket ob du eine Verbindung z.B. innerhalb von 5 Sek zu einem Server aufbauen kannst.


UDP ist doch ein verbindungsloses Protokoll. Du schickst Packete los und hörst nie wieder etwas von ihnen ;)

Ich würde vorschlagen, du stellt einen timer und baust für das anschliessende SIGALRM nen signalhandler mit setjmp() und longjmp()

Felix Kaiser
12.02.2002, 14:14
Les mal richtig :p Ich hab gesagt um zu prüfen ob eine Verbindung mit dem Server zu Stande kommt und nicht um Pakete zu senden etc... Zu dem ist UDP sehr nützlich, da z.B. DNS Server Queries standardmäßig nur über UDP laufen.

SelFi
12.02.2002, 15:18
hmm egal diese möglichkeit bringt mich auch nicht viel für meine anwendung

Baegsch
12.02.2002, 16:24
Ich weiss zwar jetzt nicht wie du das meinst, guru, aber udp ist doch imho verbindungslos. Wie soll ich da testen ob eine Verbindung zu Stande kommt? Da gibt es ja keine Verbindungsprozedur, wie bei tcp. Das udp nützlich ist habe ich ja auch nirgends abgestritten ;)

Felix Kaiser
12.02.2002, 18:11
Udp kann verbindungslos sein, du kannst aber auch ganz normale Verbindungen damit herstellen und Daten mit Servern austauschen, Verbindungen prüfen, etc.

Baegsch
12.02.2002, 21:27
würde mich freuen wenn du mir das mal an einem bisschen code deutlich machen könntest :)

Felix Kaiser
12.02.2002, 23:16
Ich werde jetzt ganz gewiss nicht meinen Source für ein DNS Server Query posten, der funktioniert nur mit UDP Sockets: Verbinden, Senden, auf Antwort warten, bleibt Antwort aus -> Fehler (Timeout bei mir 2 Sek.). Und PING funktioniert ähnlich, Verbindung herstellen, ICMP senden auf Antwort warten, bleibt Antwort aus -> Ping timeout!

Jedoch um zu prüfen, ob ein Hostname existiert und somit online ist, gibt es eine Funktion LookupHostAddr(Host); Diese Funktion ermittelt über den DNS Server ob einem Host eine IP zugewiesen werden kann. Kann eine zugewiesen werden kann man in der Regel davon ausgehen, dass der Server online ist. Standardmäßig liegt dieses Timeout bei weniger als 5 Sekunden. Kann aber variieren. LookupHostAddr ist eine Methode der Klasse TBaseSocket, kann aber in davon abgeleiteten Klassen ebenso verwendet werden, wie z.B. TUdpSocket.

Baegsch
13.02.2002, 00:14
Schau dir bitte mal das udp-rfc an. Dort sind keine Bemerkungen zu einer Verbindung o.ä. vorhanden. Ein udp-packet wird nie eine Verbindung aufbauen! Es sind immer Datenpackete... Ich glaub wir reden aneinander vorbei.

Ich wollte code zum checken ob eine Verbindung besteht über udp. Ich will keine vollständige DNS-Abfrage, welche ja auch keine Verbindung erfordert.

Felix Kaiser
13.02.2002, 16:29
Sag mal bist du dumm oder wie? Wer redet von Paketen? Ich hab gesagt, über UdpSockets kann man eine Verbindung aufbauen und prüfen innerhalb eines bestimmten Timeouts ob eine Verbindung zu einem Zielrechner möglich ist. Und eine DNS Abfrage erfordert eine Verbindung, und zwar die zum DNS Server. Such mal über Google nach einem funktionierenden Pingcode. Du wirst sehen, dass dieser über einen Udp Socket erfolgt.

Ping IP to IP: Send UDP, Receive ICMP.

Baegsch
14.02.2002, 15:36
*lach* bleib mal bitte sachlich ;) Wer hier dumm ist kann sich jeder denken wie ers will!

Ping über udp? zu welchem port gehts denn dann *lach* (Hint: rfc 791; Punkt 2.1). OK, wir lassen diese Thema mal. Du solltest mir nur zeigen wie man eine udp-verbindung aufbaut! IMHO sollte das ziemlich schwer fallen, da udp, wie schon oftmals gesagt, ein verbindungsloses Protokoll ist! Du schickst da sofort Daten! Und ich frag mich was du von Packeten redest.... alles geht als Packet ins web. selbst ein Verbindungsaufbau, eines Protokolls, dass eine Verbindung erfordert, wird als Datenpacket verschickt.... aber wie gesagt: wir lassen das; kommt eh nichts raus

nj0y
14.02.2002, 15:41
@ Baegsch

Sorry, aber Dein Text kommt mir ein wenig arrogant vor.

Eine Verbindung ist Definitionssache. Man kann zwar über UDP keine echte TCP/IP-Verbindung herstellen, aber man könnte ein eigenes Protokoll, das auf UDP aufsetzt, bauen, das eine Pseudo-Verbindung herstellt. Man könnte z. B. eine ICMP-Anfrage incl. Antwort als Verbindung für die Dauer der Anfrage und Antwort definieren.

Oder man definiert eine Verbindung als etwas, was von einem Punkt zum anderen Punkt Daten bewegen kann. Und das kann UDP ohne Frage.

Man sollte hier ein wenig beim Thema bleiben und nicht über Kleinigkeiten streiten. Es geht ja nur darum, daß SelFi den Server anpingen soll, um zu gucken, ob er da ist oder nicht. Verbindung hin oder her, das ist eine schnelle Möglichkeit, sein Timeout-Problem zu reduzieren.

Baegsch
14.02.2002, 20:09
Ich will mich ja auch nicht streiten. Bloß Sätze wie "Sag mal bist du dumm oder wie?" brauch ich mir nicht anzuhören - das braucht wohl keiner hier wirklich! Und wenn mir jmd. sagen will, dass icmp über udp läuft dann stelle ich das natürlich richtig. Und zum Thema hab ich ja meine Lösung schon gesagt ;)



OK, vielleicht haben wir ein wenig aneinander vorbei geredet... was solls.

Felix Kaiser
14.02.2002, 22:22
Kann sein, aber dann wohl eher weil du nicht richtig verstanden hast, wie man mit UdpSockets arbeitet ... Zu dem läuft Ping ohne Port. Man weißt einem UdpSocket den Zielhost zu und sendet einfach ein ICMP Paket. Dann wartet man sein Timeout ab und wenn nichts zurückkam, schlecht. Timeout. Kam was zurück, so sollte es doch nach Möglichkeit wieder das gesendete ICMP Paket sein und man sollte parallel die Zeit messen, wielange es auf eine Antwort gebraucht hat. Und schon hat man den Pingwert zu einem Rechner....

Zu dem passt ein Beispiel für Ping wohl am besten zum Thema.

Baegsch, ich empfehle dir die Sache mit Sockets wirklich nochmal genauer anzuschaun, dass du in Zukunft nicht wieder Unwahrheiten postest, die dem der gefragt hat ja im Endeffekt doch nichts bringen und wenn du dich so uneinsichtig gegen eine Berichtigung deiner Behauptungen stellst ist dieses Forum echt der falsche Platz!

Baegsch
15.02.2002, 00:13
Nein, ich diskutier jetzt nicht weiter! Ich verweise ebenfalls auf Lektüre.

roxxi
14.03.2005, 13:01
hallo Felix...

ist es nicht so, dass du mit setsockopt() bei einem Socket den timeout setzen kannst?

cu

eViLiSSiMo
14.03.2005, 13:22
Du hast schon gesehen das der Thread 3 Jahre alt ist, oder ?

;)


Scavi: Sag ich doch 3 :OP

Jan Krüger
14.03.2005, 13:26
Siehe meine Antwort in deinem neuen Thread (http://www.coding-board.de/board/showthread.php?t=14225).

Zur Debatte an sich: bei UDP kann man, soweit ich weiß, nicht prüfen, ob eine "Verbindung" zustande kommt, denn UDP bietet schließlich keine Fehlerkorrektur- und -erkennungsmechanismen wie TCP. Man kann also nur innerhalb eines Protokolls, das über UDP versendet, überprüfen, ob in einer gewissen Zeitspanne die vom Protokoll erwartete Antwort kommt, oder ICMP-Nachrichten wie "host not reachable" verarbeiten (was u.U. das Betriebssystem für einen erledigt; Linux macht sowas zum Beispiel, aber das System dafür ist etwas gewöhnungsbedürftig) -- das hat aber beides nichts mit UDP zu tun.

Scavi
14.03.2005, 13:26
3 Jahre ist der alt!!

roxxi
14.03.2005, 15:23
ne, hab ich nicht... haett sonst auch nicht gepostet :)