2012-09-03 2 views
1

에서 동의 오류 번호가 나는 사람 페이지에서 지금까지는 어디 :: 여기 socket.h

socklen_t cli_size; 
struct sockaddr cli; 
int in_sock; 

/* event from TCP server socket, new connection */ 
cli_size = sizeof(cli); 
try { 
    if ((in_sock = ::accept(handle,&cli, &cli_size)) < 0) { 
     throw in_sock; 
     return NULL; 
     } 
    } 
catch(int ex) { 
    cout << "Exception Nr. " << ex << endl; 
    } 

무슨이다 :

오류에

, -1이 반환되고, errno는 적절하게 설정하십시오.

질문 : 나는 아직도 어디에서 errno인지 이해할 수 없습니까? 예외를 이해해야합니다.

답변

4

errnoaccept과 같은 시스템 호출이 실패한 후에 오류 코드가 포함 된 전역 정수 변수입니다. 정의 할 변수에 헤더 파일 <errno.h>을 포함해야 할 수도 있습니다. 귀하의 경우에는

, 당신은 accept에 의해 반환 된 값하지만 errno의 값 던져 안 :

try 
{ 
    if ((in_sock = accept(...)) == -1) 
     throw errno; 
    // ... 
} 
catch (int error) 
{ 
    std::cout << "Error code " << error << " (" << std::strerror(error) << ")\n"; 
} 

기능 std::strerror이 헤더 파일 <cstring>에 선언을하고 오류를 설명하는 문자열을 반환합니다.

중요한주의 사항 : 의 값은 함수가 실패한 경우에만 의 값만 유효합니다. 예에서 accept이 성공하면 errno의 값은 정의되지 않습니다.

+0

감사합니다. 5 분 후에 승인합니다. 결과 : 오류 코드 24 (너무 많은 열린 파일) ... 와우, 이해할 수없는 것입니다. 소켓 ... 파일 ... – Cynede

+1

@ Linux 시스템에서 (소켓과 같은) 소켓은 다른 것입니다 파일 디스크립터를 사용하고 일반 파일과 동일한 테이블을 사용합니다. 이 오류는 1000 개가 넘는 연결 및/또는 파일이 열려 있다는 것을 의미합니다. 이는 사용 후 연결 및 파일을 제대로 닫지 않았 음을 나타낼 수 있습니다. –

+0

아하, 고맙다, 내 스레드가 잘못 작동했다. – Cynede