2015-07-09 15 views
5

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?

+0

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. –

+0

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

risposta

0
  1. Ilya è di destra, si dovrebbe essere aprendo un socket UDP con

    socket.socket (socket.AF_INET, socket.SOCK_DGRAM)

  2. Stai binding alla porta 0, che è non valido. Se questa non è una porta in entrata, non è necessario collegarla. Questo potrebbe spiegare perché il tuo sendto call sta bloccando.

  3. L'array Send_Data deve contenere solo i dati , non "la piena pacchetto Ethernet".

  4. L'array send_data deve essere sotto la dimensione MTU per la rete, altrimenti potrebbe essere interrotto in modo silenzioso. Varia, ma meno di 1300 dovrebbe funzionare, più di 1500 quasi certamente non funzionerà.

Problemi correlati