Heim  >  Artikel  >  Backend-Entwicklung  >  So ermitteln Sie, ob der Socket in Golang geschlossen ist

So ermitteln Sie, ob der Socket in Golang geschlossen ist

尚
Original
2020-01-13 10:44:503865Durchsuche

So ermitteln Sie, ob der Socket in Golang geschlossen ist

Ein Socket ist eine Abstraktionsschicht, über die Anwendungen Daten senden oder empfangen und Vorgänge wie Dateien öffnen, lesen, schreiben und schließen können.

Methode 1:

Wenn der Rückgabewert von recv() kleiner oder gleich 0 ist, wird die Socket-Verbindung getrennt. Es muss jedoch auch festgestellt werden, ob errno gleich EINTR ist. Wenn errno == EINTR ist, bedeutet dies, dass die Recv-Funktion zurückkehrt, nachdem das Programm das Signal empfangen hat und die Socket-Verbindung noch normal ist, die Socket-Verbindung jedoch nicht sein sollte geschlossen.

Methode 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 断开

Methode 3:

Wenn Systemfunktionen wie Select verwendet werden und die Verbindung zum Remote-Ende getrennt ist, gibt select 1 zurück und recv gibt 0 zurück, um die Verbindung zu trennen . . Andere Vorsichtsmaßnahmen sind die gleichen wie in Gesetz 1.

Methode 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));

Wenn nach dem Einstellen die Verbindung getrennt wird, schlägt das Lesen und Schreiben über den Socket sofort fehl und es wird ein ETIMEDOUT-Fehler zurückgegeben.

Für weitere Golang-Kenntnisse zahlen Sie bitte Achtung PHP-Chinese-Website Golang-Tutorial Spalte.

Das obige ist der detaillierte Inhalt vonSo ermitteln Sie, ob der Socket in Golang geschlossen ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:So verpacken Sie GolangNächster Artikel:So verpacken Sie Golang