서버/클라이언트 프로그램을 작성했습니다. 그리고 select
체크 소켓을 사용하십시오. 그러나 클라이언트 클로즈 소켓 (서버의 TCP 상태가 close_wait
에 들어갈 때)을 선택하면 항상 1을 반환하고 errno는 0입니다.tcp in close_wait, select always returns 1
왜 select
이 반환하나요? Tcp 소켓은 지금 읽을 것이 없습니다!
서버 :
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(6999);
socklen_t socklen = sizeof(struct sockaddr_in);
bind(sock, (struct sockaddr *)&addr, socklen);
listen(sock, 0);
int clisock;
clisock = accept(sock, NULL, NULL);
fd_set backset, rcvset;
struct timeval timeout;
timeout.tv_sec = 3;
int maxfd = clisock+1;
FD_SET(clisock, &rcvset);
backset = rcvset;
int ret;
while(1) {
rcvset = backset;
timeout.tv_sec = 3;
ret = select(maxfd, &rcvset, NULL, NULL, &timeout);
if(ret <= 0)
continue;
sleep(1);
printf("ret:%d, %s\n",
ret, strerror(errno));
}
클라이언트 :
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(6999);
socklen_t socklen = sizeof(struct sockaddr_in);
connect(sock, (struct sockaddr *)&addr, socklen);
sleep(3);
close(sock);
sleep(100);
출력 :
./server
ret:1, Success
ret:1, Success
ret:1, Success
원격 종점이 연결을 닫으면 로컬 종단점은 읽을 수있게되지만 '읽기'는 '0'을 반환합니다. 이는 원격 종단점이 닫혔다는 표시이며, '읽기'는 '0'을 반환합니다. –
'errno'의 사용에 관해서는, 실제로 * 에러가 아닌 한 체크하지 마시고 오류가있는 함수 호출 후에 직접 체크하십시오 (즉,'select'가 실패하면'errno'를' 선택 '). '수면'이 실패하면 어떻게 될지 생각해보십시오. 그러면'errno'는'sleep' 함수의 에러를 포함하게됩니다. –
루프가 너무 빠르기 때문에 잠을 듭니다. errno는 항상 0입니다. 감사합니다! –