업데이트 흐름. 내가 얻는 오류는 EINPROGRESS가 아닌 ECONNREFUSED입니다. error
변수를 확인한 결과 0보다 큰 것으로 확인되었으므로 error
대신 errno
을 인쇄했습니다. 물론 은 connect()
에 대한 호출 이후 값이 변경되지 않았기 때문에 EINPROGRESS
입니다.getsockopt 함수는() 연결 비 블로킹에 EINPROGRESS를 반환() + 선택()
질문에 답변했습니다. 고마워요.
내가 연결 차단> 스티븐스 UNIX 네트워크 프로그래밍 아닌 같이 코드하여 같은 조각을 사용하고() 예 :
- 이 (
- 가 블로킹 연결 함 앤지 비 블로킹에 소켓을 설정)
즉시 완료- 확인
- 전화를 선택() 타임 아웃 등) (일부는 버지니아로 돌아 오면
- 준비 읽기 기다리거나 쓰기 0보다 큰 값은 getsockopt (socket, SOL_SOCKET, SO_ERROR, & 오류, & len)입니다.
오류는 EINPROGRESS입니다. 코드는 rhel5 서버에서 실행됩니다.
이 오류가 발생하는 이유는 무엇입니까?
코드 스 니펫 : 0보다 큰
flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
if ((retVal = connect(sockfd, saptr, salen)) < 0)
if (errno != EINPROGRESS)
return (-1);
if (retVal == 0)
{
// restore file status flags
fcntl(sockfd, F_SETFL, flags);
return 0;
}
FD_ZERO(&rset);
FD_SET(sockfd, &rset);
wset = rset;
tval.tv_sec = nsec;
tval.tv_usec = 0;
if ((retVal = select(sockfd + 1, &rset, &wset, NULL, &tval)) == 0)
{
// timeout
close(sockfd);
errno = ETIMEDOUT;
return (-1);
}
if (retVal < 0)
{
// select() failed
return (-1);
}
if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset))
{
len = sizeof(error);
error = 0;
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
return (-1);
if (error > 0) //<<<<< error == EINPROGRESS >>>
{
close(sockfd);
errno = error;
return (-1);
}
}
else
{
return (-1);
}
// restore file status flags
fcntl(sockfd, F_SETFL, flags);
을 공유하십시오. 어쩌면 관련 코드 스 니펫을 게시해야합니다. – Duck
예기치 않은 일이 있습니까? non-blocking'connect'는 연결이 완료 될 때까지'EINPROGRESS'를보고합니다. 이것은 man 페이지의'connect'에 문서화되어 있습니다. – ephemient
@ephemient : 연결에 대한 하위 호출이 EALREADY를 반환합니까? –