Profilo di nuzzopippo

Nome nuzzopippo
Indirizzo email nuzzopippo@gmail.com
AvatarAvatar utenti
Messaggi144
Firma forum
Fatti non foste a viver come bruti...
  • Re: sqlite3 in rete
    Forum >> Programmazione Python >> Database
    ...
    In pratica i farei un db principale e poi farei tanti db quanti sono gli utenti; vorrei fare in modo che gli utenti quando leggono il db leggano il principale mentre quando scrivono il db scrivino su quello personale; pensavo poi di fare una procedura sul server che con scadenza di 20/30 secondi controlli se nei vari db locali ci sai quancosa di nuovo e... se si lo copia nel db principale "leggibile da tutti".
    ...
    Scusa la domanda, in genere utilizzo altri db per certe cose, ma c'è un qualche motivo che rende difficile l'utilizzo di un singolo database con accesso concorrente?

    Tutto sommato i tempi di scrittura non dovrebbero essere eccessivi, la concorrenza minima con 5-6 utenti e racchiudendo l'operazione di scrittura in blocchi "begin concurrent -> commit" l'interferenza dovrebbe essere minima.

    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    Ho fatto qualche adattamento ...
    In effetti e quello che si deve fare : capire le indicazioni, approfondire ed adattare il tutto ai propri scopi.
    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    Poi, cosa che non c'entra nulla con Python, ho eliminato molti più caratteri
    L'intestazione con il FROM TO LEN a livello pratico delle nostre necessità non riveste alcuna importanza

    Si, ho provato le nuove impostazioni con il server che ho mandato ptima ... naturalmente, funzionano male con esso dato che trattano un protocollo di comunicazione che non vi è contemplato.

    ... C'è quel "nostre" che mi preoccupa un po' ... hai presente, vero, che quelle che Ti do solo solo indicazioni e che dovresti approfondire le tematiche rivenienti?

    Vi sono problematiche che temo potresti non aver presenti, che non danno molto fastidio a Te che codifichi ma se passi il Tuo lavoro ad altri è bene non ci siano ... Te ne indicherò un paio in seguito

    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    ...
    E' possibile che quella finestra Rispetti i ritorni a capo ??

    La finestra rispetterà i ritorni a capo solo (e soltanto) se riceverà una stringa codificata quale utf-8, i singoli caratteri"\" e "n", passati come tali non verranno interpretati come new-line ... in pratica, dovresti decodificare l'insieme di bytes da passare alla finestra come 'utf-8'

    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    Mi defisci collega, troppo onore. Mi reputo uno smanettone ignorante.

    Non credere io sia un "sapiente" sono a mia volta un (vecchio) smanettone ignorante che cerca di imparare qualcosa, magari su python ho avuto più tempo di Te ma rimani un collega :)




    Veniamo ora ai punti di cui Ti volevo avvertire :

    1 - in utility.Delivery vi sono diverse istruzioni "raise RuntimeError ...." esse stanno li perché dovrebbero essere intercettate e gestite, altrimenti emetteranno un traceback in una eventuale shell di avvio, ovviamente quando lo ho manipolato non ho "gonfiato" il codice con la gestione degli errori, pensaci ... al minimo trasforma i "raise" in "return"




    2 - più "pesante", il recv dei socket è bloccante, come è impostato al momento Chatterbox alla chiusura della applicazione rimane appeso un thread in attesa di comunicazione (è un daemon) ... non se ne accorge nessuno ma non è una bella cosa ... e qui si incappa in complessità da far piangere (socket + thread + strutturazione codice) ... soluzione di "emergenza" :

    A - in Chatterbox :

    - funzione "connect" definire un timeout per il socket immediatamente dopo la connessione, così:

                self.sok.connect((self.svr, self.port))
                self.sok.settimeout(0.1)
    
    
    la "temporizzazione" è di un decimo di secondo

    - gestire l'errore di timeout nel target del thread, modificando il metodo "listen" come segue:

        def listen(self) -> None:
            while self.still:
                try:
                    data = self.sok.recv(2048)
                    if data:
                        # qui andrebbe una queue per collezionare i dati giunti
                        # ma complicherebbe le cose, mi limito a comunicare
                        msg = ['RECEIVED', data[86:-3].decode(encoding="UTF-8", errors="ignore")]
                        #print(msg)
                        self.pub.send_message('LISTENERS', msg)
                except socket.timeout:
                    continue
            self.sok.close()
            msg = ['OUTCOME', f'Connessione con {self.svr} chiusa']
            self.pub.send_message('OBSERVER', msg)
            self.pub.unsubscribe('WORKER', self.obs)
    
    
    B - modificare PAGINA in modo che dia tempo alle operazioni del socket, ritengo sia bene spezzettare "_on_close" in modo da avere più "ordine" nella eliminazione delle registrazione e tempo, in questo modo:

        def _on_close(self) -> None:
            msg = ['CLOSING', 'CLOSING']
            self.pub.send_message('WORKER', msg)
            self.top.after(500, self.__close)
    
        def __close(self) -> None:
            self.pub.unsubscribe('OBSERVER', self.obs)
            self.pub.unsubscribe('LISTENERS', self.obs)
            self.top.destroy()
    
    
    credo debba essere sufficiente.




    Comunque, thread e socket sono bestioline complicate ed approfondite, così come la strutturazione del codice ... hai ricevuto la mia email di risposta? Se ritieni posso inviarti una maccheronica traduzione (fatta da me e non pubblicabile) di un tutorial sui thread che ho trovato "buono" come spunto per approfondire l'argomento.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    beh ... c'è ancora quel "consigliami" in ballo ;)

    Copia questo codice in "utility.py"

    import tkinter as tk
    
    class BufferedText(tk.Text):
        '''Una Text-box inibibile alla scrittura senza disabilitazione
           e che espone un numero stabilito di righe di testo.'''
        key_none = ['Alt_L', 'Alt_R', 'Caps_Lock', 'Control_L', 'Control_R', 'Down', 'End',
                    'Escape', 'Execute', 'F1', 'F2', 'Fi', 'F12', 'Home', 'Insert', 'Left',
                    'Linefeed', 'KP_Add', 'KP_Begin', 'KP_Divide', 'KP_Down', 'KP_End',
                    'KP_Home', 'KP_Insert', 'KP_Left', 'KP_Next', 'KP_Prior','KP_Right',
                    'KP_Up', 'Next', 'Num_Lock', 'Pause', 'Print', 'Prior', 'Right',
                    'Scroll_Lock', 'Shift_L', 'Shift_R', 'Tab', 'Up']
        def __init__(self, parent: callable, active: bool=False, rowsize: int=0, *args, **kwargs) -> None:
            super().__init__(parent, *args, **kwargs)
            self.parent = parent
            self._active = active
            self._rowsize =  rowsize if rowsize >=0 else 0
            self._bg = self['background']
            self.bind('<KeyPress>', self._on_key)
            self.bind('<FocusIn>', self._on_focus)
            self.bind('<FocusOut>', self._out_focus)
    
        def _on_key(self, evt: callable) -> None:
            if  evt.keysym in ['Return', 'KP_Enter'] and self._rowsize:  # valuta il caso si aggiunga una riga
                if not self._active: return 'break'
                self._evaluate_rows()
            elif not self._active and not evt.keysym in self.key_none:
                return 'break'
        
        def _evaluate_rows(self):
            if not self._rowsize: return
            rows = int(self.index('end').split('.')[0]) - 2
            if self._active and self.parent.focus_get() == self:
                rows += 1
            if rows > self._rowsize:  # raggiunto il limite di righe stabilito
                for i in range(rows - self._rowsize):
                    self.delete('1.0', '1.end + 1 char')
                    self.update()
                
        def _on_focus(self, evt: callable) -> None:
            color = '#ffffc0' if self._active else '#bfe5f1'
            self.configure(bg=color)
        
        def _out_focus(self, evt: callable) -> None:
            self.configure(bg=self._bg)
        
        def is_active(self) -> bool:
            return self._active
        
        def activate(self) -> None:
            self._active = True
        
        def disable(self) -> None:
            self._active = False
    
        @property
        def buffer(self) -> int:
            return self._rowsize
    
        @buffer.setter
        def buffer(self, buff: int) -> None:
            self._rowsize = buff if buff >=0 else self._rowsize
            self._evaluate_rows()
    
        def add_text(self, text: str) -> None:
            self.insert('end', text)
            self._evaluate_rows()
            self.see('end')
    
    
    avrai disponibile un Text tkinter che potrai rendere a sola lettura senza disattivarlo e cui potrai porre un limite alle righe da visualizzare, per farlo edita il file "pkt_gui_rcs.py" inserendo questo import

    from utility import BufferedText
    Poi modifica il punto con self.TESTO_RX in questo modo

            self.TESTO_RX = BufferedText(self.FrameRX, rowsize=200, height=5, wrap='none')
            #self.TESTO_RX.place(relx=0.005, rely=0.1, height=350, width=915)
            self.TESTO_RX.grid(row=1, column=0, padx=(5,1), pady=(5,1), sticky='nsew')
            
            '''self.TESTO_RX.configure(activebackground="#f9f9f9")
            self.TESTO_RX.configure(anchor='w')
            self.TESTO_RX.configure(background="#ffffec")
            self.TESTO_RX.configure(compound='left')
            self.TESTO_RX.configure(disabledforeground="#a3a3a3")
            self.TESTO_RX.configure(font="-family {Courier} -size 10")
            self.TESTO_RX.configure(foreground="black")
            self.TESTO_RX.configure(highlightbackground="#d9d9d9")
            self.TESTO_RX.configure(highlightcolor="black")
            self.TESTO_RX.configure(justify='left')'''
            vscroll = tk.Scrollbar(self.FrameRX, orient=tk.VERTICAL,
                                   command=self.TESTO_RX.yview)
            vscroll.grid(row=1, column=1, padx=(1,5), pady=(5,1), sticky='ns')
            self.TESTO_RX.configure(yscrollcommand=vscroll.set)
            hscroll = tk.Scrollbar(self.FrameRX, orient=tk.HORIZONTAL,
                                   command=self.TESTO_RX.xview)
            hscroll.grid(row=2, column=0, padx=(5,1), pady=(1,5), sticky='ew')
            self.TESTO_RX.configure(xscrollcommand=hscroll.set)
            #self.TESTO_RX.configure(textvariable=self.TestoRicevuto)
            #self.TestoRicevuto.set('''''')
            self.FrameRX.grid_columnconfigure(0, weight=1)
            self.FrameRX.grid_rowconfigure(1, weight=1)
    
    
    quindi modifica il metodo "obs" così

        def obs(self, message: list) -> None:
            op = message[0]
            txt = ''
            if op != 'ERROR':
                txt = message[1]
                self.TESTO_RX.add_text(txt + '\n')
            else:
                txt = 'AVVENUTO ERRORE : ' + message1
            #old = self.TestoRicevuto.get()
            #txt = old + '\n'+ txt
            #self.TestoRicevuto.set(txt)
    
    
    Dovresti trovarTi una text-box che fa quello che mi hai chiesto.

    Ho cercato di spiegarne il funzionamento in questo post, su di un sito di cui sono l'howner, c'è anche il codice di una finestra di test e potrebbe mostrarTi altri tipi di approccio.

    Se mi dirai che ne pensi sarà gradito.




    Ciao




    P.S. : Per il Tuo virus non ne so niente, non uso windows dal secolo scorso ;)

    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-24 20:05:53:
    ...
    Poi alla ricezione successiva è andato in errore
    Exception in thread Thread-1 (listen):
    ...
    File "D:\DRIVE-BRUNO\PYTHON\PROVE\PKT_GUI_RCS\utility.py", line 86, in listen
    msg = ['RECEIVED', data[36:-3].decode()]
    ...
    Argghhh vale 248 decimale / è °

    Prova a fare questo tentativo:
    # implenta questa funzione nel modulo utility
    def read_message(data: bytes) -> str:
        return ''.join([chr(int.from_bytes(x, 'little')) for x in data[36:-3]])
    
    #trasforma questa istruzione
     msg = ['RECEIVED', data[36:-3].decode()]
    #così
      msg = ['RECEIVED', read_message(data)]
    
    
    la funzione "dovrebbe" trasformare ogni singolo byte in un intero e poi nel carattere corrispondente, quindi unire tutto in stringa e restituire la stringa formata.
    Non la ho testata (appena sveglio e con poco tempo) ma penso dovrebbe funzionare, possibile variante sarebbe utilizzare "big" invece di "little", dipende dalla benedetta codifica con cui vengono trasmessi i dati, di certo molto oscura.

    Fai sapere, ciao


    EDIT : No, lascia perdere, non funziona

    il problema dovrebbe nascere dalla codifica di trasmissione, di certo non utf-8, vai ad ad indovinare che codifica viene utilizzata (forse la cp1252?) ... meglio la Tua soluzione di ignorare gli errori.

    Una variante potrebbe essere utilizzare esclusivamente il chr() ma darebbe caratteri impropri per gli utf-8 da due bytes ... forse bisognerebbe guardarsi la documentazione l'header scartato (i 36 bit) per vedere se vi è qualcosa riguardo alla codifica del messaggio.





    --- Ultima modifica di nuzzopippo in data 2024-02-25 10:50:44 ---

    --- Ultima modifica di nuzzopippo in data 2024-02-25 11:38:06 ---
    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-24 13:39:59:
    Ti chiedo se sia il caso di postare i file nella loro versione "quasi" definitiva a beneficio di quanti dovessero cimentarsi con un colloquio TCP/IP fra applicazioni
    È mia opinione che condividere la conoscenza sia sempre bene, da un lato rende informazioni,magari ottenute con fatica, fruibili agli altri, d'altro lato può spingere a suggerimenti circa eventuali miglioramenti. Comunque, rappresentano un momento di crescita condivisa.
    Pietro Bruno Lancerotto said @ 2024-02-24 13:39:59:
    E come già chiesto ti chiedo di orientarmi su cosa mettere al posto della Label nel riquadro ricezione
    Avevo già letto il Tuo "consigliami", la risposta è scontata : tkinter.text + scrollbars ... per me è facile da realizzare ma il primo pensiero che mi è venuto in mente è stato : e mo' come gli spiego come si fa?




    Ho già realizzato un sub-classamento della classe tkinter.Text che si auto-limita ad un numero di linee di testo definito dall'user e che può o meno essere modificabile senza essere disabilitata (nel mio linux una tkinter.Text disabilitata come aspetto fa piangere), una volta completati i test e collegata al codice utilizzato per esemplificare con lo echo-server che ho usato post fa, fornirò qui le istruzioni per inserire la sub-classe nella Tua applicazione e su di un sito più comodo le spiegazioni sul suo funzionamento, ci sono diverse cose da tener presenti in merito alla implementazione.




    Sempre in ambito "consigliami":

    Le classi sono inevitabili parlando di GUI, cerca di comprenderle, il tutorial è un buon inizio, principalmente se lo condisci con la documentazione, relativamente a tkinter, necessiterai di molte ricerche in rete, comunque la documentazione meglio organizzata a mio parere è quella sulla versione 8.5, un po' vecchiotta ma molto utile ... sono "strumenti" che io uso quotidianamente, poi ci sono tante prove ed olio di gomito ...

    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-23 15:16:35:
    Mi dai l'imput giusto per "segare" il pacco di byte ??

    Beh, lo header è di 36 bit, è detto chiaramente nel link di AGWPE da Te indicato, apparentemente soundmodem aggiunge al CR finale del messaggio un suo CR ed un carattere nullo, quindi basterebbe trattare i dati ricevuti come una lista di bit e farne lo slicing eliminando i primi 36 caratteri e gli ultimi tre, poi, volendo, si decodifica in utf-8 e si suddivide in base ai CR contenuti per avere le varie righe componenti il testo.
    Esempio :
    Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
    Type "help", "copyright", "credits" or "license()" for more information.
    >>> data = b'\x00\x00\x00\x00T\x00\x00\x00NOVEGN\x00\x00\x00\x00TUTTI\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00 1:Fm NOVEGN To
     TUTTI <UI pid=F0 Len=76 >[15:04:14]\rDa Postazione NOVEGNO 23-02-2024 15:04:14 MESSAGGIO INFORMATIVO: PROVA 1\r\r\x00'
    >>> data[36:-3]
    b' 1:Fm NOVEGN To TUTTI <UI pid=F0 Len=76 >[15:04:14]\rDa Postazione NOVEGNO 23-02-2024 15:04:14 MESSAGGIO INFORMATIVO: PROVA 1'
    >>> testo = data[36:-3].decode()
    >>> testo
    ' 1:Fm NOVEGN To TUTTI <UI pid=F0 Len=76 >[15:04:14]\rDa Postazione NOVEGNO 23-02-2024 15:04:14 MESSAGGIO INFORMATIVO: PROVA 1'
    >>> for r in testo.split('\r'):
    ...     print(r)
    ... 
    ...     
     1:Fm NOVEGN To TUTTI <UI pid=F0 Len=76 >[15:04:14]
    Da Postazione NOVEGNO 23-02-2024 15:04:14 MESSAGGIO INFORMATIVO: PROVA 1
    beh ... Sembra che, finalmente la cosa comincia a "muoversi",

    Realizzato ciò che Ti serve, suggerirei di sperimentare un po' tutte le possibilità indicate in quel documento AGWPE e magari approfondire un po' con il protocollo AX.25 ... e magari sperimentare un po' le classi (non averne paura), chissà, potresti tirarne fuori qualcosa di carino ;)

    Ciao
    Edit: le stringhe lunghe nel codice causano un eccessivo allargamento della pagina, pro a spezzare la stringa dati


    --- Ultima modifica di nuzzopippo in data 2024-02-23 16:45:36 ---
    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-23 11:47:33:
    ammesso abbia capito bene, prova a codificarla ed inviarla quale primo messaggio e vedi se ricevi qualcosa,
    Posso mandarla automaticamente subito dopo il connect ??
    Si, provaci e vedi che succede,

    certezze non ne ho perché la parte iniziale del documento parla di configurazioni di winsock che non ho presenti e non saprei dire quanto sono influenti.
    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Ho dato una lettura, mi sembra di capire che per ottenere comunicazioni bisogna inviare una richiesta come indicato in "Enable Reception of Monitoring Frames (‘m’ frame)", ossia un messaggio con la stringa

    b'0000m0000000000000000000000000000000'
    
    ammesso abbia capito bene, prova a codificarla ed inviarla quale primo messaggio e vedi se ricevi qualcosa, poi magari prova ad inviare il Tuo messaggio e vedi che succede.




    Ho scoperto che soundmodem esiste anche per linux, ho provato ad installarlo ma pare che non trova hardware necessario e non funzia, la diagnostica da esito negativo ... purtroppo, io qui mi pianto, non potendo sperimentare (oltre a non sapere dove vorrei andare a parare)




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-20 19:32:08:
    Allego 3 catture fatte con 3 terminali diversi
    Fatto il dump vedo che tutti e tre i terminali ricevono risposta dalla porta 8000

    Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
    Type "help", "copyright", "credits" or "license()" for more information.
    file_1 = 'AGWTerm.txt'
    file_2 = 'EasyTerm.txt'
    file_3 = 'QtTermTCP.txt'
    with open(file_1) as f:
        text = [x for x in f.read().splitlines() if 'localhost.8000' in x]
    
        
    for r in text: print(r)
    
    18:17:44.609242 IP localhost.52068 > localhost.8000: Flags [S], seq 416943911, win 65535, options [mss 65495,nop,wscale 8,nop,nop,sackOK], length 0
    18:17:44.609242 IP localhost.8000 > localhost.52068: Flags [S.], seq 664282257, ack 416943912, win 65535, options [mss 65495,nop,wscale 8,nop,nop,sackOK], length 0
    18:17:44.609242 IP localhost.52068 > localhost.8000: Flags [.], ack 1, win 10233, length 0
    18:17:44.611241 IP localhost.52068 > localhost.8000: Flags [P.], seq 1:37, ack 1, win 10233, length 36
    18:17:44.611241 IP localhost.8000 > localhost.52068: Flags [.], ack 37, win 10233, length 0
    18:17:44.611241 IP localhost.8000 > localhost.52068: Flags [P.], seq 1:87, ack 37, win 10233, length 86
    18:17:44.611241 IP localhost.52068 > localhost.8000: Flags [.], ack 87, win 10233, length 0
    18:17:45.274261 IP localhost.52068 > localhost.8000: Flags [P.], seq 37:73, ack 87, win 10233, length 36
    18:17:45.275258 IP localhost.8000 > localhost.52068: Flags [.], ack 73, win 10233, length 0
    18:17:45.275258 IP localhost.52068 > localhost.8000: Flags [P.], seq 73:109, ack 87, win 10233, length 36
    18:17:45.275258 IP localhost.8000 > localhost.52068: Flags [.], ack 109, win 10233, length 0
    18:17:45.275258 IP localhost.8000 > localhost.52068: Flags [P.], seq 87:124, ack 109, win 10233, length 37
    18:17:45.275258 IP localhost.52068 > localhost.8000: Flags [.], ack 124, win 10233, length 0
    18:17:51.798749 IP localhost.8000 > localhost.52068: Flags [P.], seq 124:312, ack 109, win 10233, length 188
    18:17:51.798749 IP localhost.52068 > localhost.8000: Flags [.], ack 312, win 10232, length 0
    18:18:02.847759 IP localhost.8000 > localhost.52068: Flags [P.], seq 312:486, ack 109, win 10233, length 174
    18:18:02.847759 IP localhost.52068 > localhost.8000: Flags [.], ack 486, win 10231, length 0
    18:18:03.827759 IP localhost.8000 > localhost.52068: Flags [P.], seq 486:666, ack 109, win 10233, length 180
    18:18:03.827759 IP localhost.52068 > localhost.8000: Flags [.], ack 666, win 10230, length 0
    18:18:05.126066 IP localhost.52068 > localhost.8000: Flags [P.], seq 109:164, ack 666, win 10230, length 55
    18:18:05.126066 IP localhost.8000 > localhost.52068: Flags [.], ack 164, win 10233, length 0
    18:18:05.244388 IP localhost.8000 > localhost.52068: Flags [P.], seq 666:776, ack 164, win 10233, length 110
    18:18:05.244388 IP localhost.52068 > localhost.8000: Flags [.], ack 776, win 10230, length 0
    18:18:11.628663 IP localhost.8000 > localhost.52068: Flags [P.], seq 776:935, ack 164, win 10233, length 159
    18:18:11.628663 IP localhost.52068 > localhost.8000: Flags [.], ack 935, win 10229, length 0
    18:18:12.508850 IP localhost.8000 > localhost.52068: Flags [P.], seq 935:1100, ack 164, win 10233, length 165
    18:18:12.508850 IP localhost.52068 > localhost.8000: Flags [.], ack 1100, win 10229, length 0
    18:18:17.757787 IP localhost.8000 > localhost.52068: Flags [P.], seq 1100:1287, ack 164, win 10233, length 187
    18:18:17.757787 IP localhost.52068 > localhost.8000: Flags [.], ack 1287, win 10228, length 0
    18:18:20.677614 IP localhost.8000 > localhost.52068: Flags [P.], seq 1287:1428, ack 164, win 10233, length 141
    18:18:20.677614 IP localhost.52068 > localhost.8000: Flags [.], ack 1428, win 10228, length 0
    18:18:25.075585 IP localhost.52068 > localhost.8000: Flags [P.], seq 164:210, ack 1428, win 10228, length 46
    18:18:25.075585 IP localhost.8000 > localhost.52068: Flags [.], ack 210, win 10232, length 0
    18:18:25.123234 IP localhost.8000 > localhost.52068: Flags [P.], seq 1428:1529, ack 210, win 10232, length 101
    18:18:25.123234 IP localhost.52068 > localhost.8000: Flags [.], ack 1529, win 10227, length 0
    >>> with open(file_2) as f:
    ...     text = [x for x in f.read().splitlines() if 'localhost.8000' in x]
    ... 
    ...     
    >>> for r in text: print(r)
    ... 
    17:49:29.599048 IP localhost.8000 > localhost.51813: Flags [P.], seq 1794115577:1794115723, ack 59268856, win 10233, length 146
    17:49:29.599048 IP localhost.51813 > localhost.8000: Flags [.], ack 146, win 10229, length 0
    17:49:30.896758 IP localhost.8000 > localhost.51813: Flags [P.], seq 146:301, ack 1, win 10233, length 155
    17:49:30.896758 IP localhost.51813 > localhost.8000: Flags [.], ack 301, win 10228, length 0
    17:49:31.966997 IP localhost.8000 > localhost.51813: Flags [P.], seq 301:462, ack 1, win 10233, length 161
    17:49:31.966997 IP localhost.51813 > localhost.8000: Flags [.], ack 462, win 10228, length 0
    17:49:35.547816 IP localhost.8000 > localhost.51813: Flags [P.], seq 462:644, ack 1, win 10233, length 182
    17:49:35.547816 IP localhost.51813 > localhost.8000: Flags [.], ack 644, win 10227, length 0
    17:49:39.997085 IP localhost.8000 > localhost.51813: Flags [P.], seq 644:820, ack 1, win 10233, length 176
    17:49:39.997085 IP localhost.51813 > localhost.8000: Flags [.], ack 820, win 10226, length 0
    17:49:56.612474 IP localhost.51813 > localhost.8000: Flags [P.], seq 1:42, ack 820, win 10226, length 41
    17:49:56.612474 IP localhost.8000 > localhost.51813: Flags [.], ack 42, win 10233, length 0
    17:49:56.657948 IP localhost.8000 > localhost.51813: Flags [P.], seq 820:915, ack 42, win 10233, length 95
    17:49:56.657948 IP localhost.51813 > localhost.8000: Flags [.], ack 915, win 10226, length 0
    17:50:00.616768 IP localhost.8000 > localhost.51813: Flags [P.], seq 915:1060, ack 42, win 10233, length 145
    17:50:00.616768 IP localhost.51813 > localhost.8000: Flags [.], ack 1060, win 10226, length 0
    17:50:07.535732 IP localhost.51813 > localhost.8000: Flags [P.], seq 42:101, ack 1060, win 10226, length 59
    17:50:07.535732 IP localhost.8000 > localhost.51813: Flags [.], ack 101, win 10232, length 0
    17:50:07.843526 IP localhost.8000 > localhost.51813: Flags [P.], seq 1060:1174, ack 101, win 10232, length 114
    17:50:07.843526 IP localhost.51813 > localhost.8000: Flags [.], ack 1174, win 10225, length 0
    17:50:25.926558 IP localhost.8000 > localhost.51813: Flags [P.], seq 1174:1319, ack 101, win 10232, length 145
    17:50:25.926558 IP localhost.51813 > localhost.8000: Flags [.], ack 1319, win 10225, length 0
    >>> with open(file_3) as f:
    ...     text = [x for x in f.read().splitlines() if 'localhost.8000' in x]
    ... 
    ...     
    >>> for r in text: print(r)
    ... 
    17:36:46.313599 IP localhost.8000 > localhost.51755: Flags [P.], seq 1577673553:1577673719, ack 4221444206, win 10233, length 166
    17:36:46.313599 IP localhost.51755 > localhost.8000: Flags [.], ack 166, win 10229, length 0
    17:37:19.128719 IP localhost.8000 > localhost.51755: Flags [P.], seq 166:311, ack 1, win 10233, length 145
    17:37:19.128719 IP localhost.51755 > localhost.8000: Flags [.], ack 311, win 10228, length 0
    Ho notato, per altro, nei dati di AGWTerm un contemporanea notevole scambio dati tra le porte 51825-51826 di localhost ... ha qualche pertinenza?




    Comunque, è evidente che nei terminali "professionali" all'invio dati SM risponde al realizzando terminale tkinter invece no ... certo manca "qualcosa" che personalmente non ho presente

    Pietro Bruno Lancerotto said @ 2024-02-20 19:32:08:
    Il tutto deve finire con un unico CR perchè si possa proseguire altrimenti SM non riceve più

    Ed il CR lo hai inserito nel redigere il messaggio, per altro da quanto Hai indicato SM riceve il messaggio normalmente ma non da alcuna risposta, cercando in giro non ho trovato motivo del differente comportamento, forse non ho saputo cercare.

    Temo che qua servirebbe un intervento di utenti più esperti di me, a parte l'incognita "protocollo AX.25" non vedo perché il seppur minimale codice adottato non riceva risposta.




    C'è da dire che i socket hanno uniradidio di possibilità di configurazione, c'è da perdersi in merito alle varie opzioni, potrebbe anche essere in quell'ambito il problema :(



    Pietro Bruno Lancerotto said @ 2024-02-20 19:32:08:
    PS: mi sono "studiato" ScrolledText(..)
    ma per gestire il muose si tira dietro 'na montagna de roba

    Non so cosa sia ScrolledText ma per associare una tkinter.Text ad una scrollbar ad una scrollbar bastano 1 istruzione (oltre, naturalmente, le 2-3 per definire la scrollbar) ... sarei tentato di farTi un esempio di come vedrei io la Tua finestra (con le classi, ovvio) ... comunque, temo proprio avrebbe lo stesso problema di mancata risposta da parte di SM.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-19 19:17:05:
    Magari mi destreggio con qualche funzione ma purtroppo molte cose di Python mi sono ostiche
    Senza una conoscenza di base su come ragiona la faccenda e abbastanza difficile
    Una su tutte... non riesco ad inquadrare le classi
    Purtroppo, Ti sei imbarcato in una impresa complicata, che richiede tutta una serie di conoscenze a monte, e non riferisco al solo python.




    Ho cercato un po' in rete, mi son reso conto di non avere idee riguardo il mondo AX25, sul quale essenzialmente si basa ciò che vuoi realizzare ... per altro mi son venuti dubbi riguardo al SoundModem, in particolare circa una sua "risposta".

    Per altro, ho spesso incontrato menzione di altri "strumenti", tipo "direwolf" ed "easyterm" (un terminale), in particolare su questa interessante pagina, non saprei dire se possano esserTi utili (e magari li conosci già) comunque li segnalo.

    Pietro Bruno Lancerotto said @ 2024-02-19 19:17:05:
    Volevo dire che se mi collego al SM , il sistema funziona solo in invio
    Posso fare N invii che saranno perfettamente ricevuti da questo senza dare risposta
    Beh, almeno una parte funziona ,,,
    Pietro Bruno Lancerotto said @ 2024-02-19 19:17:05:
    Il problema è capire cosa c'è di diverso fra gli invii verso SM e verso il tuo Server

    Il mio è un echo-server, progettato apposta perché risponda, non è detto che ciò che è impostato per SoundModem lo sia.

    Per altro, vi è l'incognita del protocollo, non sapendo a priori come avviene il dialogo ... certo, nei primi pacchetti ricavati con wireshark che hai inviato la risposta di SoundModem al terminale specifico c'è, il sospetto che manchi qualcosa nella comunicazione con il terminale in costruzione sorge ... purtroppo, non mi è venuta alcuna idea su come individuare quel "qualcosa"

    Pietro Bruno Lancerotto said @ 2024-02-19 19:17:05:
    Poi faccio una prova attivando il terminale e rimanendo in ascolto su SM con Radio accesa
    Ascoltando l'APRS arrivano pacchetti a manetta
    Dove, sul Tuo terminale o su SoundModem?
    Pietro Bruno Lancerotto said @ 2024-02-19 19:17:05:
    Giusto per vedere se solo l'eco che non viene rispedita o se non invia nulla




    Il dump della comunicazione tra il Tuo terminale e SoundModem evidenzia che non viene trasmesso nulla, da parte di quest'ultimo, prima del reset della connessione, bisognerebbe sincerarsi cosa differenzia la comunicazione (nei termini di protocollo e di invio dati) con il Tuo terminale e quell'altro di dotazione ... mi sembra di ricordare che nei precedenti post hai scritto di aver tolto qualcosa (un ritorno a capo mi pare) che Ti dava problemi, era sul pacchetto di invio?

    Fatti non foste a viver come bruti...