Home  >  Article  >  Backend Development  >  How to determine whether the socket is closed in golang

How to determine whether the socket is closed in golang

尚
Original
2020-01-13 10:44:503911browse

How to determine whether the socket is closed in golang

A socket is an abstraction layer through which applications can send or receive data, and can open, read, write, and close operations like files. .

Method 1:

When the return value of recv() is less than or equal to 0, the socket connection is disconnected. However, it is also necessary to determine whether errno is equal to EINTR. If errno == EINTR, it means that the recv function returns after the program receives the signal, and the socket connection is still normal, and the socket connection should not be closed.

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

Method 3:

If system functions such as select are used and the remote end is disconnected, select returns 1 and recv returns 0 to disconnect. . Other precautions are the same as those in Law 1.

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

After setting, if it is disconnected, reading and writing using the socket will fail immediately and return ETIMEDOUT error

For more golang knowledge, please pay attention PHP Chinese website golang tutorial column.

The above is the detailed content of How to determine whether the socket is closed in golang. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:How to package golangNext article:How to package golang