Sono nuovo in Python e sto provando a inviare un array di byte come un pacchetto grezzo usando un socket. Il mio IP è 192.168.0.116
e il dispositivo a cui sto inviando questo è 192.168.0.64
. Questo dispositivo client è un'unità basata sul microcontrollore che sta eseguendo il mio codice per annusare semplicemente i pacchetti Ethernet e verificare un particolare modello. Sto usando pacchetti UDP e ho provato il firmware lato client usando 'Ostinato' nel mio PC per inviare un pacchetto UDP non elaborato. Sto usando Wireshark per monitorare il flusso dei pacchetti di rete. Il client sembra funzionare bene con i pacchetti inviati da Ostinato.Python sendto non sembra inviare
Tuttavia, quando provo a inviare lo stesso pacchetto con Python (usando pacchetti grezzi come segue), non sembra sputare i byte perché non vedo nulla su Wireshark né il client riceve alcun dato. Ma il valore restituito da sendto()
è corretto. Quindi sembra che Python trasmetta l'array di byte a un buffer da inviare (dal sistema operativo?) Ma si ferma lì.
import socket
CLNT_UDP_IP = '192.168.0.64'
CLNT_UDP_PORT = 5005
svr_sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
send_data = [0x00, 0x11...]
send_data_arr = bytearray (send_data)
svr_sock.bind (('192.168.0.116',0))
bytes_send = svr_sock.sendto (send_data_arr, (CLNT_UDP_IP, CLNT_UDP_PORT))
svr_sock.close()
Ho eliminato i blocchi di prova, ad eccezione della chiarezza.
Un'altra cosa che ho notato è che quando la presa si sta chiudendo, ci vuole un po 'di tempo. Se commento l'istruzione sendto, esce immediatamente. Quindi sembra che il socket close stia cercando di svuotare i buffer di invio, che non sono riusciti a inviare il pacchetto.
Qualche idea?
Penso che se si desidera UDP, è necessario utilizzare socket.SOCK_DGRAM e socket.IPPROTO_UDP tipo di socket. Altrimenti devi creare manualmente l'intestazione del pacchetto. –
Grazie Ilya, prima provo con UDP e ho avuto lo stesso comportamento. Poi ho pensato che "sendto" potrebbe basarsi su alcune informazioni aggiuntive dello slave, a cui non risponde. (Quando invio lo stesso a un altro computer, funziona) Ecco perché sto provando su dati grezzi. Il buffer 'send_data []' contiene un pacchetto Ethernet completo che ho già verificato usando Ostinato. – Kaush