2014-04-06 3 views
0

C++ 클라이언트 서버 응용 프로그램을 작성했으며 서버가 충돌합니다. 시나리오1 시간 후에 처음 연결 한 후 Tcp 수신이 실패합니다.

  1. 시작 서버
  2. 나중에 1 시간 (안 전) 클라이언트는 반환을 받아 들일에서 기다리고 -1 errno는 "열려있는 파일이 너무 많습니다"로 서버

를 연결합니다.

다른 컴퓨터에서 실행되는 특별한 기능이 없어서 기다리는 동안 수락이 많은 파일 설명자를 여는 것으로 나타났습니다. 사실입니까? 클라이언트가 언제든지 연결할 수 있도록이 문제를 해결하려면 어떻게해야합니까?

관련 서버 코드 :

int sockClient; 
while (true) { 

    sockaddr_in* clientSockAddr = new sockaddr_in(); 
    socklen_t clientSockAddrLen = sizeof(sockaddr_in); 

    sockClient = accept(sockServer, (sockaddr *) clientSockAddr, 
         &clientSockAddrLen); 

    if(sockClient == -1){ 
     std::ostringstream s; 
     s << "TCP Server: accept connection error." << std::strerror(errno); 
     throw runtime_error(s.str()); 
    } 

    connection->communicate(sockClient, clientSockAddr, clientSockAddrLen); 
} 

답변

1

당신은 어딘가에 파일 기술자 누수가. 아마도 당신이 그걸 끝내면 받아 들인 소켓을 닫지 않을거야, 그렇지 않으면 어딘가에 파일에있다.

+0

시나리오에서 나는 단 하나의 연결만을 가지고 있습니다 ... 그리고 누수가 다른 곳에서 발생한다면 어떻게 위의 내용을 받아 들일 수 있습니까? 나는 돌아가서 누수에 대한 코드의 다른 영역을 검토 할 것이다. 감사. – kroiz

+0

문제가 발견되었습니다. 실제로 EJB가 옳았습니다. 다른 서버에 연결하려고 시도했지만 연결이 끊어져서 성공하지 못했지만 소켓이 해제되지 않은 루프가있었습니다. 그것은 "accept"가 실패하고 "socket"이 아닌 이유는 분명하지 않습니다 ... – kroiz

관련 문제