소켓은 애플리케이션이 데이터를 보내거나 받을 수 있고 파일과 같은 작업을 열고, 읽고, 쓰고, 닫을 수 있는 추상화 계층입니다.
방법 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!