enfache Sockets

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
dk1ri
User
Beiträge: 23
Registriert: Sonntag 2. November 2014, 11:08

Hallo,
Vorab: ich habe bisher noch keine Netzwerkprogrammierung gemacht, aber jetzt einiges gelesen, so auch: https://docs.python.org/2/library/socketserver.html
Das funktioniert ja, auch mit 2 Rechnern und die Übergabe der empfangen Daten vom Handler zum Hautptprogramm geht sicher auch.
Ich brauche aber etwas gringfügig anderes:
- Die meisten Beispiele, die ich gesehen habe, funktioneren so, dass der Client etwas fragt und der Server anwortet. Danach wird die Verbindung (der Socket ?) geschlossen. Innerhalb eines threads ist das dann "blocking", insgsamt (mit threads) natürlich nicht.
- Ich brauche etwas, bei dem der Client die Verbindung oeffnet, dann etwas sendet (oder auch nicht) und der Server auch sendet ohne Anfrage.
Die Verbindung soll so lange offen bleiben bis der client sie schliesst.
Irgendwo habe ich gelesen, dass die (Socket?)verbindungen immer kurz sind, weiss aber nicht, ob das notwendig oder nur üblich ist.
Geht das, was ich will, gar nicht mit Socketverbindungen und nur mit Telnet/ssh ?

Tnx für eine Antwort
Guenter
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

dk1ri hat geschrieben:Irgendwo habe ich gelesen, dass die (Socket?)verbindungen immer kurz sind, weiss aber nicht, ob das notwendig oder nur üblich ist.
Geht das, was ich will, gar nicht mit Socketverbindungen und nur mit Telnet/ssh ?
Telnet/SSH verwenden auch sockets, das ist lediglich das Protokoll! Du kannst im Grunde eine Verbindung so lange offen halten wie du willst.
the more they change the more they stay the same
dk1ri
User
Beiträge: 23
Registriert: Sonntag 2. November 2014, 11:08

Danke für die Antwort.
Ich müsste dann also getrennte threads für schreiben und lesen auf den gleichen socket machen, und besser socket als socketserver?
Schreiben und lesen soll ja unabhaegig voneinader funktionieren.
Guenter
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Man sollte allerdings Bedenken dass es nicht nur eine Frage davon ist wie lange man sockets offen hält, sondern auch davon wie lange sie offen bleiben. Internetverbindungen sind vielleicht Zuhause oder im Büro noch recht stabil aber unterwegs siehts i.d.R. nicht so gut aus. Es macht also schon Sinn ein Protokoll so zu gestalten dass man mit Verbindungsabbrüchen möglichst gut klar kommt.

ssh kommt mit Verbindungsabbrüchen z.B. nicht zurecht und lässt sich deswegen in manchen Situation nicht gebrauchen.
dk1ri
User
Beiträge: 23
Registriert: Sonntag 2. November 2014, 11:08

ok, ich werde das berücksichtigen. Zunächst brauche ich diese Verbindung zum Testen des Programms, später ist der meiste Datenverkehr aber eher im Haus. Aber sicher muss ich da Fehler auch abfangen..
BlackJack

Ein bisschen OffTopic hier, aber für den SSH-Problemfall ist mosh eine gute Lösung.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

dk1ri hat geschrieben:Ich müsste dann also getrennte threads für schreiben und lesen auf den gleichen socket machen, und besser socket als socketserver?
Threads kann man machen, ist aber eine unschöne und mMn sogar schwierigere Lösung, wenn du Python 3 verwendest, kannst du dir asyncio anschauen. Eine Library die unter Python 2 und 3 funktioniert ist z.B. gevent, es gibt allerdings noch mehr Frameworks wie gevent (Twisted, Tornado, greenlet, ...).

Persönlich bin ich ein großer Fan von gevent.
the more they change the more they stay the same
dk1ri
User
Beiträge: 23
Registriert: Sonntag 2. November 2014, 11:08

Die beiden Libraries kenne ich noch nicht, da bin ich erst mal etwas beschaftigt. :)
Ich benutze Python3, jetzt Windows, spaeter Raspberry
Das Programm, fuer das die Schnittstellen vorgesehen sind, ist ein OSI Layer 7 router mit (spaeter)schnellen und sehr langsamen Interfaces (i2C ..)
Zur Zeit polle ich im Hauptprogramm die Inputbuffer; vielleicht sind diese eventhandler ja die bessere Lösung.
Zum Testen des routing Kerns brauche ich erst mal neben Keyboard eine 2. Schnittstelle; ich dachte, mit einer einfachen Socketschnittstelle geht es am einfachsten :(
dk1ri
User
Beiträge: 23
Registriert: Sonntag 2. November 2014, 11:08

@David
Den Server und den passenden client habe ich jetzt mit threads hinbekommen. Fuer die Ethernetschnittstelle werde ich erst mal dabei bleiben, auch wenn die Rechnerlast höher ist als mit gevent/greenlet (wie ich gelesen habe).

Für den Parser der Inputbuffer des Routers kann greenlet aber die effektivere Lösung sein als das, was ich bisher mache. Danke für den Hinweis.

Guenter
Antworten