Go Socket Programming (2): l'implémentation sous-jacente et la gestion du délai d'expiration de la fonction Dial

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:

Implémentation sous-jacente de la fonction Net.DialSingle

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:

Implémentation du catalogue de fonctions syscall.Socket

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  DialTimeouttransmettre 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:

Gestion du délai d'expiration de la connexion réseau

Délai de demande et de réponse

Après avoir utilisé la   fonction Dial ou  DialTimeoutpour é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  SetWriteDeadlinerespectivement. 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)

 

Je suppose que tu aimes

Origine blog.csdn.net/wxy_csdn_world/article/details/107445220
conseillé
Classement