Maison  >  Article  >  développement back-end  >  Comment déterminer si le socket est fermé dans Golang

Comment déterminer si le socket est fermé dans Golang

尚
original
2020-01-13 10:44:503911parcourir

Comment déterminer si le socket est fermé dans Golang

Un socket est une couche d'abstraction à travers laquelle les applications peuvent envoyer ou recevoir des données et peuvent ouvrir, lire, écrire et fermer des opérations telles que des fichiers.

Méthode 1 :

Lorsque la valeur de retour de recv() est inférieure ou égale à 0, la connexion socket est déconnectée. Cependant, il est également nécessaire de déterminer si errno est égal à EINTR. Si errno == EINTR, cela signifie que la fonction recv revient après que le programme a reçu le signal, et que la connexion socket est toujours normale et que la connexion socket ne doit pas être. fermé.

Méthode 2 :

  struct tcp_info info; 
  int len=sizeof(info); 
  getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
  if((info.tcpi_state==TCP_ESTABLISHED))  则说明未断开  else 断开

Méthode 3 :

Si des fonctions système telles que select sont utilisées, si l'extrémité distante est déconnectée, select renvoie 1 et recv renvoie 0 pour se déconnecter . Les autres précautions sont les mêmes que celles de la loi 1.

Méthode 4 :

int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

Après le réglage, s'il est déconnecté, la lecture et l'écriture à l'aide du socket échoueront immédiatement et renverront l'erreur ETIMEDOUT

Pour plus de connaissances sur Golang, veuillez payer attention à la colonne tutoriel golang du site Web PHP chinois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Comment emballer GolangArticle suivant:Comment emballer Golang