2013-11-01 9 views
9

seguente è un pitone presa frammento:come differenziare TCP/UDP durante la programmazione socket

import socket 
socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

La mia domanda è: non lo stato della linea whethet sarà trasportato connessione socket tramite TCP/IP? Fino ad ora stavo programmando solo connessioni TCP, usando la linea sopra, ma probabilmente non ero consapevole del fatto. Sono in grado di programmare le connessioni UDP usando i socket python? Come posso differenziare lo strato di trasporto?

La domanda non è strettamente connessa a python, le spiegazioni sono benvenute pure in C++ o qualsiasi altra cosa.

risposta

9

Il secondo argomento determina il tipo di socket; socket.SOCK_DGRAM è UDP, socket.SOCK_STREAM è un socket TCP. Tutto questo a condizione che si stia utilizzando una famiglia di socket AF_INET o AF_INET6.

Prima di continuare, forse si voleva andare a leggere il Python socket programming HOWTO, così come altri tutorial di programmazione del socket. La differenza tra i socket UDP e TCP è piuttosto grande, ma le differenze si traducono tra i linguaggi di programmazione.

Alcuni dati su prese del Python Wiki:

+0

"* ..., è un socket TCP *" se e solo se il primo argomento è 'AF_INET'. –

+0

@ Robᵩ: O 'AF_INET6' –

+0

D'accordo, un' STREAM' indica una connessione TCP. – pmoleri

5

La sintassi generale per la creazione di un socket è:

socket(socket_family, socket_type, protocol=0) 

possiamo usare sia AF_INET (per IPv4) o AF_INET6 (IPv6) come l'abete st argomento i., e per socket_family.

Il socket_type è l'argomento che determina se il socket da creare è TCP o UDP. Per i socket TCP sarà SOCK_STREAM e per UDP sarà SOCK_DGRAM (DGRAM - datagram). Infine, possiamo tralasciare l'argomento del protocollo che lo imposta sul valore predefinito di '0'.

Per i socket TCP si dovrebbero utilizzare i metodi bind(), listen() e accept() per i socket del server e connect() o connect_ex() per i socket client. Mentre per i socket UDP non sono necessari i metodi listen(), accept() e connect() (poiché i socket TCP sono socket orientati alla connessione mentre i socket UDP sono socket meno socket).

Esistono metodi specifici disponibili per UDP per inviare e ricevere pacchetti rispettivamente recvfrom() e sendto() mentre recv() e send() sono per TCP. Fare riferimento a questo documentation for socket per ulteriori informazioni sui rispettivi metodi per TCP e UDP. Anche Core Python Applications Programming by Wesley Chun è un libro migliore per alcune basi piuttosto sulla programmazione di socket.

+1

grazie per la spiegazione, soprattutto per il libro! – ducin

0

La differenza principale è che i socket TCP sono basati sulla connessione. Non è possibile inviare o ricevere nulla finché non si è connessi a un altro socket TCP sulla macchina remota. Una volta connesso, un socket TCP può solo inviare e ricevere da/verso la macchina remota. Ciò significa che avrai bisogno di un socket TCP per ogni client nella tua applicazione. UDP non è basato sulla connessione, è possibile inviare e ricevere a/da chiunque in qualsiasi momento con lo stesso socket.

~ Muralidhar gundala