>백엔드 개발 >Golang >golang에서 소켓이 닫혀 있는지 확인하는 방법

golang에서 소켓이 닫혀 있는지 확인하는 방법

尚
원래의
2020-01-13 10:44:503966검색

golang에서 소켓이 닫혀 있는지 확인하는 방법

소켓은 애플리케이션이 데이터를 보내거나 받을 수 있고 파일과 같은 작업을 열고, 읽고, 쓰고, 닫을 수 있는 추상화 계층입니다.

방법 1:

recv()의 반환 값이 0보다 작거나 같으면 소켓 연결이 끊어집니다. 그러나 errno가 EINTR과 같은지 확인하는 것도 필요합니다. errno == EINTR이면 이는 프로그램이 신호를 받은 후 recv 함수가 반환된다는 의미이며 소켓 연결은 닫혀서는 안 됩니다.

방법 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 断开

방법 3:

select 등의 시스템 기능을 사용하는 경우 원격 끝의 연결이 끊어지면 선택은 1을 반환하고 recv는 0을 반환하여 연결을 끊습니다. 그 외 주의사항은 제1조와 동일합니다.

방법 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));

설정 후 연결이 끊어지면 소켓을 사용한 읽기 및 쓰기가 즉시 실패하고 ETIMEDOUT 오류가 반환됩니다.

더 많은 Golang 지식을 보려면 PHP 중국어 웹사이트 golang 튜토리얼을 참고하세요. 칼럼.

위 내용은 golang에서 소켓이 닫혀 있는지 확인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.