[Python] socket e MSG_OOB: bug?
Remo The Last
py.remothelast a yahoo.it
Sab 6 Set 2014 14:02:25 CEST
Manlio, stai scherzando vero?
Stai dicendo che il trasporto udp è più affidabile del tcp (best effort)?
ciacia
Il Venerdì 5 Settembre 2014 12:04, Manlio Perillo <manlio.perillo a gmail.com> ha scritto:
2014-09-04 12:19 GMT+02:00 Remo The Last <py.remothelast a yahoo.it>:
Buongiorno lista.
>Continuando la mia programmazione relativa all'invio di segnali hex, ho potuto confermare quanto letto in linea che un server python con flag MSG_OOB
Perchè mai usi MSG_OOB, ossia messaggi fuori banda, la cui semantica è implementation specific?
http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html
http://pubs.opengroup.org/onlinepubs/9699919799/functions/recv.html
crasha sempre. E questa è una conferma.
>
>
Cosa intendi con crasha?
Per me (e per molti altri) crashare significa andare in segfault, ma dubito che sia questo il caso.
Probabilmente intendi che viene sollevata una eccezione, che dovrebbe darti utili informazioni aggiuntive.
Ma è anche vero che un socket client con flag MSG_OOB taglia a destra di un byte il messaggio da inviare.
Come saprai, se fai un send(N bytes) e recv(N bytes) non è detto che recv ti restituisca esattamente N bytes, ma di solito qualcosa in meno.
Il tutto poi è complicato dall'uso dei messaggi out-of-band.
Che tipo di socket stai usando?
Che sistema operativo?
L'ho potuto appurare sia in locale con una semplice applicazione client-server ma anche su un mio server remoto. In intrambi i casi il messaggio è risultato tagliato a destra di una byte. Tipo: msg="hello world" e arriva "hello worl". Per ovviare allungo di un byte il messaggio e questo arriva completo come messaggio da invio originale.
>
>
Questo è un errore molto comune tra chi si avvicina alla programmazione di rete.
Quando invii qualcosa via socket di tipo stream devi **sempre** usare un protocollo che permetta a chi riceve i dati di capire dove inizia e dove finisce un "messaggio".
In particolare, se vuoi spedire messaggi brevi in modo facile, usa i socket di tipo SOCK_DGRAM invece di SOCK_STREAM, ma assicurati di capire come funzionano.
Ciao Manlio
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20140906/ddd18fb5/attachment.html>
Maggiori informazioni sulla lista
Python