Probleme TCP-Server

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Ich habe eure Ratschläge befolgt und mit einen "fertigen" TCP-Server besorgt.
Ich habe diesen Server hier genutzt:

https://docs.python.org/3/library/socketserver.html

und in diesem Beispiel umgesetzt.

Code: Alles auswählen

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
     
    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{}:{} wrote:".format(self.client_address[0],self.client_address[1]))
        print(self.data)
        # just send back the same data, but upper-cased
        #self.request.sendall(self.data.upper())
        
        msg = self.data
        print(msg)
        
        if msg[2] == 0x07:
            print("<- U (STARTDT act)")
            data = bytearray(msg)
            data[2] = 0x0B
            self.request.sendall(data)
            print("-> U (STARTDT con)")
        elif msg[2] == 0x43:                              
            print("<- U (TESTFR act)")
            data = bytearray(msg)
            data[2] = 0x83
            self.request.sendall(data)
            print("-> U (TESTFR con)")
        else:
            print("NIL: {}".fomat(msg))


HOST, PORT = "localhost", 2404

    # Create the server, binding to localhost on port 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        # Activate the server; this will keep running until you
        # interrupt the program with Ctrl-C
        server.serve_forever()
Der Server läuft stabil, auch durch den Client verursachte Unterbrechungen werden sicher erkannt.

Allerdings kommen nicht alle Frames des Client an.
In Wireshark sehe ich das Frame (126 11.557244):
17 1.538268 127.0.0.1 52036 127.0.0.1 2404 TCP 56 52036 → 2404 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1
18 1.538378 127.0.0.1 2404 127.0.0.1 52036 TCP 56 2404 → 52036 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1
19 1.538419 127.0.0.1 52036 127.0.0.1 2404 TCP 44 52036 → 2404 [ACK] Seq=1 Ack=1 Win=2161152 Len=0
20 1.539193 127.0.0.1 52036 127.0.0.1 2404 IEC 60870-5-104 50 <- U (STARTDT act)
21 1.539231 127.0.0.1 2404 127.0.0.1 52036 TCP 44 2404 → 52036 [ACK] Seq=1 Ack=7 Win=2161152 Len=0
22 1.543046 127.0.0.1 2404 127.0.0.1 52036 IEC 60870-5-104 50 -> U (STARTDT con)
23 1.543099 127.0.0.1 52036 127.0.0.1 2404 TCP 44 52036 → 2404 [ACK] Seq=7 Ack=7 Win=2161152 Len=0
24 1.544044 127.0.0.1 2404 127.0.0.1 52036 TCP 44 2404 → 52036 [FIN, ACK] Seq=7 Ack=7 Win=2161152 Len=0
25 1.544097 127.0.0.1 52036 127.0.0.1 2404 TCP 44 52036 → 2404 [ACK] Seq=7 Ack=8 Win=2161152 Len=0
26 1.544191 127.0.0.1 52036 127.0.0.1 2404 TCP 44 52036 → 2404 [FIN, ACK] Seq=7 Ack=8 Win=2161152 Len=0
27 1.544264 127.0.0.1 2404 127.0.0.1 52036 TCP 44 2404 → 52036 [ACK] Seq=8 Ack=8 Win=2161152 Len=0
28 1.545093 127.0.0.1 52037 127.0.0.1 2404 TCP 56 52037 → 2404 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1
29 1.545224 127.0.0.1 2404 127.0.0.1 52037 TCP 56 2404 → 52037 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1
30 1.545277 127.0.0.1 52037 127.0.0.1 2404 TCP 44 52037 → 2404 [ACK] Seq=1 Ack=1 Win=2161152 Len=0
71 6.545328 127.0.0.1 52037 127.0.0.1 2404 IEC 60870-5-104 50 <- U (STARTDT act)
72 6.545383 127.0.0.1 2404 127.0.0.1 52037 TCP 44 2404 → 52037 [ACK] Seq=1 Ack=7 Win=2161152 Len=0
73 6.549790 127.0.0.1 2404 127.0.0.1 52037 IEC 60870-5-104 50 -> U (STARTDT con)
74 6.549861 127.0.0.1 52037 127.0.0.1 2404 TCP 44 52037 → 2404 [ACK] Seq=7 Ack=7 Win=2161152 Len=0
75 6.551681 127.0.0.1 2404 127.0.0.1 52037 TCP 44 2404 → 52037 [FIN, ACK] Seq=7 Ack=7 Win=2161152 Len=0
76 6.551740 127.0.0.1 52037 127.0.0.1 2404 TCP 44 52037 → 2404 [ACK] Seq=7 Ack=8 Win=2161152 Len=0
77 6.551891 127.0.0.1 52037 127.0.0.1 2404 TCP 44 52037 → 2404 [FIN, ACK] Seq=7 Ack=8 Win=2161152 Len=0
78 6.551971 127.0.0.1 2404 127.0.0.1 52037 TCP 44 2404 → 52037 [ACK] Seq=8 Ack=8 Win=2161152 Len=0
79 6.552910 127.0.0.1 52038 127.0.0.1 2404 TCP 56 52038 → 2404 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1
80 6.553087 127.0.0.1 2404 127.0.0.1 52038 TCP 56 2404 → 52038 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1
81 6.553171 127.0.0.1 52038 127.0.0.1 2404 TCP 44 52038 → 2404 [ACK] Seq=1 Ack=1 Win=2161152 Len=0
122 11.553990 127.0.0.1 52038 127.0.0.1 2404 IEC 60870-5-104 50 <- U (STARTDT act)
123 11.554025 127.0.0.1 2404 127.0.0.1 52038 TCP 44 2404 → 52038 [ACK] Seq=1 Ack=7 Win=2161152 Len=0
124 11.556558 127.0.0.1 2404 127.0.0.1 52038 IEC 60870-5-104 50 -> U (STARTDT con)
125 11.556600 127.0.0.1 52038 127.0.0.1 2404 TCP 44 52038 → 2404 [ACK] Seq=7 Ack=7 Win=2161152 Len=0
126 11.557244 127.0.0.1 52038 127.0.0.1 2404 IEC 60870-5 ASDU 60 <- I (0,0) ASDU=65535 C_IC_NA_1 Act IOA=0
127 11.557277 127.0.0.1 2404 127.0.0.1 52038 TCP 44 2404 → 52038 [ACK] Seq=7 Ack=23 Win=2161152 Len=0
128 11.557540 127.0.0.1 2404 127.0.0.1 52038 TCP 44 2404 → 52038 [FIN, ACK] Seq=7 Ack=23 Win=2161152 Len=0
129 11.557571 127.0.0.1 52038 127.0.0.1 2404 TCP 44 52038 → 2404 [ACK] Seq=23 Ack=8 Win=2161152 Len=0
130 11.557626 127.0.0.1 52038 127.0.0.1 2404 TCP 44 52038 → 2404 [FIN, ACK] Seq=23 Ack=8 Win=2161152 Len=0
Im Code nicht:

Code: Alles auswählen

127.0.0.1:52036 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
2022-01-25 21:47:13,855 - INFO - <- U (STARTDT act)
2022-01-25 21:47:13,856 - INFO - -> U (STARTDT con)
127.0.0.1:52037 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
2022-01-25 21:47:18,861 - INFO - <- U (STARTDT act)
2022-01-25 21:47:18,863 - INFO - -> U (STARTDT con)
127.0.0.1:52038 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
2022-01-25 21:47:23,869 - INFO - <- U (STARTDT act)
2022-01-25 21:47:23,870 - INFO - -> U (STARTDT con)
127.0.0.1:52039 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
2022-01-25 21:47:28,873 - INFO - <- U (STARTDT act)
2022-01-25 21:47:28,873 - INFO - -> U (STARTDT con)
127.0.0.1:52042 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
2022-01-25 21:47:33,876 - INFO - <- U (STARTDT act)
2022-01-25 21:47:33,876 - INFO - -> U (STARTDT con)
127.0.0.1:52043 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
2022-01-25 21:47:38,881 - INFO - <- U (STARTDT act)
2022-01-25 21:47:38,882 - INFO - -> U (STARTDT con)
127.0.0.1:52044 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
2022-01-25 21:47:43,888 - INFO - <- U (STARTDT act)
2022-01-25 21:47:43,889 - INFO - -> U (STARTDT con)
127.0.0.1:52046 wrote:
b'h\x04\x07\x00\x00\x00'
b'h\x04\x07\x00\x00\x00'
Was könnte es für Gründe geben, das nur die Frames mit msg[2] == 0x07 durchkommen?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Zeile hier sieht falsch aus:

Code: Alles auswählen

        self.data = self.request.recv(1024).strip()
Dir ist klar, dass das auch (wieder) jedes Byte einzeln kommen kann?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

__blackjack__ hat geschrieben: Dienstag 25. Januar 2022, 23:45 Die Zeile hier sieht falsch aus:

Code: Alles auswählen

        self.data = self.request.recv(1024).strip()
Die stammt aus den "offiziellen" Beispielen:

Examples
socketserver.TCPServer Example
This is the server side:

Code: Alles auswählen

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        # Activate the server; this will keep running until you
        # interrupt the program with Ctrl-C
        server.serve_forever()
        
Komisch ist ja, dass alle "kleineren" Frames durchkommen?
__blackjack__ hat geschrieben: Dienstag 25. Januar 2022, 23:45 Dir ist klar, dass das auch (wieder) jedes Byte einzeln kommen kann?
Joa.... ich hatte in die anderen Vorschläge reingeschaut.
Die waren aber irgendwie alle über meinem Niveau.

Hast du ein fertiges Beispiel ggf. mit Nutzung eines kleinen Frameworks zur Hand?
Da dürfte sich die weitere Verständigung auch einfacher gestalten.
Wichtig wäre, dass der Server eine Unterbrechung/Reboot des Clients sauber erkennt, den Server sauber schließt und wieder öffnet.

Asynchron wäre schön, aber nicht zwingend.
Mit threading hätte ich ja dann noch das Problem des Aufrufs außerhalb des threads.

Gruß
Pf@nne
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also ich finde viel weniger kompliziert als https://github.com/codypiersall/pynng/b ... reqprep.py wird es nicht.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Moin,
ich scheitere schon an der Installation von pynng...... :?

Code: Alles auswählen

pip3 install pynng     
Collecting pynng
  Downloading pynng-0.7.1.tar.gz (3.8 MB)
     |████████████████████████████████| 3.8 MB 3.3 MB/s
  Preparing metadata (setup.py) ... done
Requirement already satisfied: cffi in c:\users\pfanne\appdata\local\programs\python\python310\lib\site-packages (from pynng) (1.15.0)
Requirement already satisfied: sniffio in c:\users\pfanne\appdata\local\programs\python\python310\lib\site-packages (from pynng) (1.2.0)
Requirement already satisfied: pycparser in c:\users\pfanne\appdata\local\programs\python\python310\lib\site-packages (from cffi->pynng) (2.21)
Building wheels for collected packages: pynng
  Building wheel for pynng (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: 'C:\Users\Pfanne\AppData\Local\Programs\Python\Python310\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\Pfanne\\AppData\\Local\\Temp\\pip-install-93bk9dgg\\pynng_fecaf0105997410991c5738fb969c8c7\\setup.py'"'"'; __file__='"'"'C:\\Users\\Pfanne\\AppData\\Local\\Temp\\pip-install-93bk9dgg\\pynng_fecaf0105997410991c5738fb969c8c7\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d 'C:\Users\Pfanne\AppData\Local\Temp\pip-wheel-tt5nwwdc'
       cwd: C:\Users\Pfanne\AppData\Local\Temp\pip-install-93bk9dgg\pynng_fecaf0105997410991c5738fb969c8c7\
  Complete output (5 lines):
  running bdist_wheel
  running build
  running build_py
  error: [WinError 2] Das System kann die angegebene Datei nicht finden
  building mbedtls with: ['cmake', '-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true', '-A', 'x64', '-DENABLE_PROGRAMS=OFF', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_INSTALL_PREFIX=../prefix', '..']
  ----------------------------------------
  ERROR: Failed building wheel for pynng
  Running setup.py clean for pynng
Failed to build pynng
Installing collected packages: pynng
    Running setup.py install for pynng ... error
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\Pfanne\AppData\Local\Programs\Python\Python310\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\Pfanne\\AppData\\Local\\Temp\\pip-install-93bk9dgg\\pynng_fecaf0105997410991c5738fb969c8c7\\setup.py'"'"'; __file__='"'"'C:\\Users\\Pfanne\\AppData\\Local\\Temp\\pip-install-93bk9dgg\\pynng_fecaf0105997410991c5738fb969c8c7\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\Pfanne\AppData\Local\Temp\pip-record-2d9h1i0l\install-record.txt' --single-version-externally-managed --compile --install-headers 'C:\Users\Pfanne\AppData\Local\Programs\Python\Python310\Include\pynng'
         cwd: C:\Users\Pfanne\AppData\Local\Temp\pip-install-93bk9dgg\pynng_fecaf0105997410991c5738fb969c8c7\
    Complete output (4 lines):
    running install
    running build
    running build_py
    error: [WinError 183] Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist: 'mbedtls/build'
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'C:\Users\Pfanne\AppData\Local\Programs\Python\Python310\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\Pfanne\\AppData\\Local\\Temp\\pip-install-93bk9dgg\\pynng_fecaf0105997410991c5738fb969c8c7\\setup.py'"'"'; __file__='"'"'C:\\Users\\Pfanne\\AppData\\Local\\Temp\\pip-install-93bk9dgg\\pynng_fecaf0105997410991c5738fb969c8c7\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\Pfanne\AppData\Local\Temp\pip-record-2d9h1i0l\install-record.txt' --single-version-externally-managed --compile --install-headers 'C:\Users\Pfanne\AppData\Local\Programs\Python\Python310\Include\pynng' Check the logs for full command output.

wir jemand daraus schlau?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Ein schneller Blick auf die entsprechende Seite bei PyPI offenbart, dass es für die Python Versionen 3.5 bis 3.9 verfügbar ist.
Da es immer ein bisschen dauert, bis die Packete nachziehen, macht es wenig Sinn immer die neueste Python-Version zu verwenden.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Daten an `self.data` zu binden, ist wenig sinnvoll, weil es nicht benutzt wird. Du scheinst Binärdaten zu haben, da ist ein strip falsch.
Statt direkt `recv` oder `send` zu benutzen, ist es viel angenehmer, makefile zu benutzen, dann macht man weniger Fehler.

Code: Alles auswählen

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        with self.request.makefile('rwb') as file:
            msg = file.read(length_of_packet)
            print("{}:{} wrote:".format(self.client_address[0],self.client_address[1]))
            print(msg)
            
            if msg[2] == 0x07:
                print("<- U (STARTDT act)")
                data = bytearray(msg)
                data[2] = 0x0B
                file.write(data)
                print("-> U (STARTDT con)")
            elif msg[2] == 0x43:
                print("<- U (TESTFR act)")
                data = bytearray(msg)
                data[2] = 0x83
                file.write(data)
                print("-> U (TESTFR con)")
            else:
                print("NIL: {}".fomat(msg))
Und natürlich mußt Du auch hier wieder die Länge einer Nachricht wissen.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Sirius3 hat geschrieben: Mittwoch 26. Januar 2022, 20:22 Die Daten an `self.data` zu binden, ist wenig sinnvoll, weil es nicht benutzt wird. Du scheinst Binärdaten zu haben, da ist ein strip falsch.
Statt direkt `recv` oder `send` zu benutzen, ist es viel angenehmer, makefile zu benutzen, dann macht man weniger Fehler.

Und natürlich mußt Du auch hier wieder die Länge einer Nachricht wissen.
Das Problem ist, dass die Länge meines Frames variable ist.
Das Frame beginnt immer mit msg[0] = 0x68 gefolgt von der Länge des gesamten Frames msg[1] (ohne Byte 1 und 2).

Ich verstehe aber immer noch nicht warum kurze Frames durchkommen und längere scheinbar verworfen werden.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

sparrow hat geschrieben: Mittwoch 26. Januar 2022, 20:20 Ein schneller Blick auf die entsprechende Seite bei PyPI offenbart, dass es für die Python Versionen 3.5 bis 3.9 verfügbar ist.
Da es immer ein bisschen dauert, bis die Packete nachziehen, macht es wenig Sinn immer die neueste Python-Version zu verwenden.
Hmm... dann muss ich wohl zum Testen auf 3.9 runter....
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Pf@nne hat geschrieben: Mittwoch 26. Januar 2022, 20:56
sparrow hat geschrieben: Mittwoch 26. Januar 2022, 20:20 Ein schneller Blick auf die entsprechende Seite bei PyPI offenbart, dass es für die Python Versionen 3.5 bis 3.9 verfügbar ist.
Da es immer ein bisschen dauert, bis die Packete nachziehen, macht es wenig Sinn immer die neueste Python-Version zu verwenden.
Hmm... dann muss ich wohl zum Testen auf 3.9 runter....
mit Python 3.9 klappt die Installation von pynng.

Code: Alles auswählen

PS H:\Pfanne-NET\HomeControl\Code\Python\104-CMC-Mapper> pip show pynng
Name: pynng
Version: 0.7.1
Summary: Networking made simply using nng
Home-page: https://github.com/codypiersall/pynng
Author: Cody Piersall
Author-email: cody.piersall@gmail.com
License: MIT
Location: c:\users\pfanne\appdata\local\programs\python\python39\lib\site-packages
Requires: cffi, sniffio
Required-by
:

Beim starten gibt es aber immer noch eine Fehlermeldung:

Code: Alles auswählen

"""
Request/Reply is used for synchronous communications where each question is responded with a single answer,
for example remote procedure calls (RPCs).
Like Pipeline, it also can perform load-balancing.
This is the only reliable messaging pattern in the suite, as it automatically will retry if a request is not matched with a response.

"""
#import datetime
import pynng
import curio


#print(pynng.version)
#print(curio.__version__)

DATE = "DATE"

address = "ipc:///tmp/reqrep.ipc"


async def node0(sock):
    async def response_eternally():
        while True:
            msg = await sock.arecv_msg()
            content = msg.bytes.decode()
            if DATE == content:
                print("NODE0: RECEIVED DATE REQUEST")
                date = str(datetime.datetime.now())
                await sock.asend(date.encode())

    sock.listen(address)
    return await curio.spawn(response_eternally)


async def node1():
    with pynng.Req0() as sock:
        sock.dial(address)
        print(f"NODE1: SENDING DATE REQUEST")
        await sock.asend(DATE.encode())
        msg = await sock.arecv_msg()
        print(f"NODE1: RECEIVED DATE {msg.bytes.decode()}")


async def main():
    with pynng.Rep0() as rep:
        n0 = await node0(rep)
        await curio.sleep(1)
        await node1()

        await n0.cancel()


if __name__ == "__main__":
    try:
        curio.run(main)
    except KeyboardInterrupt:
        # that's the way the program *should* end
        pass
Ausnahme: AttributeError
module 'pynng' has no attribute 'Rep0'
:o
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Problem ist simple zu lösen:

Code: Alles auswählen

msg = file.read(2)
assert msg[0] == 0x68
msg += file.read(msg[1])
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Pf@nne hat geschrieben: Mittwoch 26. Januar 2022, 21:19
Was sagt den

import pynng
print(pynng)
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Sirius3 hat geschrieben: Mittwoch 26. Januar 2022, 21:23 Das Problem ist simple zu lösen:

Code: Alles auswählen

msg = file.read(2)
assert msg[0] == 0x68
msg += file.read(msg[1])
Die nachfolgenden Frames kommen nicht, weil die TCP Verbindung abgebaut wird.
Kann es sein, das die Fileübertragung endet, wenn der Filetransfer complete ist?

Wireshark:

Code: Alles auswählen

[Conversation completeness: Complete, WITH_DATA (63)]


Bei meinem "normalen" Server sieht die TCP Kommunikation immer so aus:

Code: Alles auswählen

[Conversation completeness: Incomplete, DATA (15)]
Müsste ich ggf. noch den Sockettype ändern?
Wobei ich auch schon den StreamRequestHandler erfolglos probiert habe.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

__deets__ hat geschrieben: Mittwoch 26. Januar 2022, 21:39
Pf@nne hat geschrieben: Mittwoch 26. Januar 2022, 21:19
Was sagt den

import pynng
print(pynng)

Code: Alles auswählen

---
<module 'pynng' from 'h:\\Pfanne-NET\\HomeControl\\Code\\Python\\104-CMC-Mapper\\CMC-104_Mapper\\pynng.py'>
---
---
<module 'pynng' from 'h:\\Pfanne-NET\\HomeControl\\Code\\Python\\104-CMC-Mapper\\CMC-104_Mapper\\pynng.py'>
---
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pf@nne: natürlich wird nur ein Frame gelesen, so hast Du es ja programmiert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Pf@nne hat geschrieben: Mittwoch 26. Januar 2022, 22:21
__deets__ hat geschrieben: Mittwoch 26. Januar 2022, 21:39
Pf@nne hat geschrieben: Mittwoch 26. Januar 2022, 21:19
Was sagt den

import pynng
print(pynng)

Code: Alles auswählen

---
<module 'pynng' from 'h:\\Pfanne-NET\\HomeControl\\Code\\Python\\104-CMC-Mapper\\CMC-104_Mapper\\pynng.py'>
---
---
<module 'pynng' from 'h:\\Pfanne-NET\\HomeControl\\Code\\Python\\104-CMC-Mapper\\CMC-104_Mapper\\pynng.py'>
---
Wenn du deine Datei nennst wie ein Modul, das du importieren wills, dann importiert die sich selbst.. hat auch nichts mit pynng zu tun, klappt genauso mit socket etc.

Also umbenennen & ggf pyc Dateien entfernen.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Sirius3 hat geschrieben: Mittwoch 26. Januar 2022, 22:33 @Pf@nne: natürlich wird nur ein Frame gelesen, so hast Du es ja programmiert.

Ja, Frame für Frame, so ist es gewollt.
Aber scheinbar wird nach dem Lesen des einen Frames die TCP-Verbindung abgebaut.
Das ist bisher mit dem "normalen" Socket nicht passiert.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was heißt hier "normale" Sockets? Du hast einen Handler, der exakt einen Frame liest und dann die Verbindung beendet. Wenn Du mehrere Frames lesen willst, brauchst Du eine Schleife.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Sirius3 hat geschrieben: Donnerstag 27. Januar 2022, 09:06 Was heißt hier "normale" Sockets? Du hast einen Handler, der exakt einen Frame liest und dann die Verbindung beendet. Wenn Du mehrere Frames lesen willst, brauchst Du eine Schleife.
EiEiEi...... da hab ich wohl den Wald vor lauter Bäumen übersehen.....
Der Server läuft jetzt stabil.

Vielen Dank für deine bisherige Geduld und Unterstützung!

Ich hab noch nicht so ganz durchschaut, wie der socketserver.py funktioniert.
Ich habe die socketserver.py in meinem Projekt: https://github.com/python/cpython/tree/ ... tserver.py
Um ein wenig auszutesten welche Functions wann genutzt werden wollte ich kurze print("XX") infos im Code platzieren.
Aber egal wo, kein print wird ausgegeben, muss man das irgendwie aktivieren?
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Eine weitere Frage wäre:
Wie bekomme ich meine Callbacks in den socketserver.py?
Antworten