L'appel sous-jacent de la fonction Dial
Dans le dernier tutoriel , nous avons présenté que le langage Go peut Dial()
établir des connexions réseau via des fonctions. En fait, la Dial()
fonction est dialTCP()
, dialUDP()
, dialIP()
et l' dialUnix()
emballage, qui peut être tracée par Dial()
la fonction source pour voir la connexion réelle est établie par les sous - jacents dialSingle()
fonctions exercées:
dialSingle()
La fonction appelle la fonction d'établissement de connexion correspondante en obtenant le type de protocole réseau à partir des paramètres entrants et renvoie l'objet de connexion. En regardant plus bas, vous pouvez voir que ces fonctions sous-jacentes appellent finalement les fonctions du package syscall pour Socket()
interagir avec l'API Socket du système d'exploitation de la plate-forme correspondant afin d'établir une connexion réseau. Pour différents protocoles de communication, différents types de connexion sont établis:
Qui domain
représente le domaine de communication, prend en charge IPv4, IPv6 et Unix, et les valeurs constantes correspondantes sont syscall.AF_INET
, syscall.AF_INET6
et respectivement syscall.AF_UNIX
.
Remarque: IPv4 et IPv6 représentent respectivement les quatrième et sixième éditions du réseau de protocole IP. Unix fait référence au domaine de communication unique dans un système d'exploitation de type Unix. Dans le même ordinateur avec un tel système d'exploitation, les applications peuvent être basées sur Ce domaine établit une connexion socket.
typ
Le type de socket représente, par exemple, la constante de type de socket TCP est le correspondant syscall.SOCK_STREAM
(communication orientée connexion), la constante de type de socket UDP est le correspondant syscall.SOCK_DGRAM
(communication sans connexion), en plus de la prise en charge syscall.SOCK_RAW
et de syscall.SOCK_SEQPACKET
deux types, SOCK_RAW
en fait, les paquets IP d'origine, SOCK_SEQPACKET
et SOCK_STREAM
similaires , les deux sont orientés connexion, sauf que le premier a une limite de message et transmet des paquets de données au lieu de flux d'octets. Habituellement, nous utilisons SOCK_STREAM
et SOCK_DGRAM
principalement.
Le dernier paramètre proto
représente le protocole de communication, et en général par défaut à elle 0
, parce que la valeur peut être déterminée par les deux premiers paramètres. Par exemple, lorsque les deux premières valeurs de paramètres sont syscall.AF_INET
et respectivement syscall.SOCK_DGRAM
, UDP est sélectionné en tant que protocole de communication, et les deux premières valeurs de paramètre sont respectivement comme syscall.AF_INET6
et syscall.SOCK_STREAM
quand sélectionneront TCP comme protocole de communication.
Bien sûr, lorsque nous écrivons des programmes réseau dans Go, nous n'avons pas du tout besoin de nous soucier de ces détails d'implémentation de bas niveau, il nous suffit d'appeler la Dial
fonction et de transmettre les paramètres correspondants.
Gestion du délai d'expiration du réseau
Le délai d'expiration du réseau est contenu dans plusieurs liens, tels que le délai de connexion, le délai d'expiration de la demande et le délai de réponse. Examinons d'abord le délai d'expiration de la connexion.
La connexion a expiré
Lorsque vous utilisez une Dial
fonction pour établir une connexion réseau, vous pouvez utiliser la fonction fournie par le package net pour DialTimeout
transmettre activement des paramètres de délai d’expiration supplémentaires afin d’établir une connexion. Le prototype de la fonction est le suivant:
func DialTimeout(network, address string, timeout time.Duration) (Conn, error) {
d := Dialer{Timeout: timeout}
return d.Dial(network, address)
}
Et Dial
l'appel de fonction, comme, juste un champ de délai d'expiration uniquement, si vous utilisez Dial
la fonction, le délai d'expiration de connexion par défaut sera géré par le système d'exploitation fournit le mécanisme pour les connexions TCP, généralement environ 3 minutes, ce qui pour notre programme, cela peut être trop long, et cette fois, vous pouvez DialTimeout
établir une connexion au code d'exemple du didacticieltcp.go
, par exemple, si la demande a été fermée à un nom de domaine étranger, par exemple facebook.com
, le programme peut ne pas répondre pendant une longue période, établira une connexion réseau à ajustez le code comme suit:
// 建立网络连接
conn, err := net.DialTimeout("tcp", service, 3 * time.Second)
Demandez à nouveau, et une erreur de délai d'expiration sera renvoyée après 3 secondes pour quitter:
Délai de demande et de réponse
Après avoir utilisé la fonction Dial
ou DialTimeout
pour établir une connexion réseau avec succès, il renverra l' net.Conn
objet, puis nous pourrons effectuer des opérations de lecture et d'écriture sur l'objet pour obtenir la demande et la réponse. Le délai d'expiration de cette partie peut être défini par Conn
les trois méthodes suivantes à condition de:
SetDeadline(t time.Time) error
SetReadDeadline(t time.Time) error
SetWriteDeadline(t time.Time) error
Nous pouvons SetDeadline
définir une lecture unifiée et le temps d'attente d' écriture, ou définir le délai d' attente de lecture et d' écriture délai d' attente à travers SetReadDeadline
et SetWriteDeadline
respectivement. Notez que ces trois méthodes transmettent des valeurs de temps absolues et non des durées relatives:
// 设置读写超时时间
err = conn.SetDeadline(time.Now().Add(5 * time.Second))
checkError(err)
Plus de fonctions d'outils
En outre, le progiciel net fournit également une série de fonctions d'outils. L'utilisation de ces fonctions peut raisonnablement améliorer l'efficacité du développement et mieux garantir la qualité du programme.
Par exemple, vous pouvez ParseIP
vérifier la validité de l'adresse IP via la fonction:
func net.ParseIP()
En IPv4Mask
créant un masque de sous-réseau:
func IPv4Mask(a, b, c, d byte) IPMask
En DefaultMask
obtenant le masque de sous-réseau par défaut:
func (ip IP) DefaultMask() IPMask
Et selon le nom de domaine pour trouver l'adresse IP correspondante:
func ResolveIPAddr(net, addr string) (*IPAddr, error)
func LookupHost(name string) (cname string, addrs []string, err error)