2015-01-30 2 views
-2

작은 http 서버가있는 응용 프로그램을 개발했습니다.내 리눅스 응용 프로그램 포트가 멈 추면 다른 서비스로 가져옵니다.

부팅 중에 내 응용 프로그램이 시작되었습니다. 내가 죽이면 (예를 들어 kill -9), http 서버 포트는 다른 데몬 (broadcom의 acsd)에 의해 직접 취해질 것입니다.

나는 drop-bear와 같은 동작을 시도했지만 문제는 재현되지 않습니다. 내가 드롭 베어를 죽이면 acsd는 포트를 사용하지 않습니다. 내 서버의 코드 뒤에 여기

: 내 HTTP 서버에서 잘못하고있어 무엇

void http_server_init(void) 
{ 
    struct sockaddr_in server; 
    int cr_port; 

    for(;;) { 
     cr_port = conf.port; 
     int i = (DEFAULT_PORT == cr_port)? 1 : 0; 
     //Create socket 
     cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0); 
     if (cr_socket_desc == -1) 
     { 
      LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno)); 
      sleep(1); 
      continue; 
     } 

     /* enable SO_REUSEADDR */ 
     int reusaddr = 1; 
     if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0) { 
      LOG (WARNING,"setsockopt(SO_REUSEADDR) failed"); 
     } 

     //Prepare the sockaddr_in structure 
     server.sin_family = AF_INET; 
     server.sin_addr.s_addr = INADDR_ANY; 
     for(;;i++) { 
      server.sin_port = htons(cr_port); 
      //Bind 
      if(bind(cr_socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) 
      { 
       //print the error message 
       LOG (ERROR,"Could not bind server socket on the port %d, Error no is : %d, Error description is : %s", cr_port, errno, strerror(errno)); 
       cr_port = DEFAULT_PORT + i; 
       LOG (INFO,"Trying to use another port: %d", cr_port); 
       continue; 
      } 
      break; 
     } 
     break; 
    } 
    LOG (INFO,"server initiated with the port: %d", cr_port); 
} 

?

+0

? 그것을 바꿔 보려 했니? – FredMaggiowski

+0

포트는 기본적으로 51005 –

+0

입니다. 잘못된 것은 아닙니다. 뭐라구? –

답변

-2

나의 질문을위한 응답이 없기 때문에. 그 문제에 대한 응답을 당신과 함께 나누고 싶습니다. 소켓이 닫혀 있지 않기 때문에

acsd 서비스 포트를 가지고있는 옵션 SO_REUSEADDR이 설정은 클라이언트/서버 포트 번호를 실행하고 무엇

-1

나는 당신이 그것을 죽였고 리소스를 해제하지 않았기 때문에 OS가 실행중인 포트에서 여전히 바쁜 포트를보고 있다는 사실을 설명했다.

Google 검색 조금 어려워서 this question과 비슷한 내용을 발견했습니다.

지금,

살인 대신 살인을 사용해보십시오 -9 또는 실행 파일이 해제 할 수 있도록 시그 잡기 시도 .. 문제가없는 코드에 있지만 킬 (kill)을 관리하는 방법에 보인다 그것의 자원 자체에 의하여

+0

명시된 문제는 포트가 정리되지 않고 오히려 다른 프로세스가 즉시 포트를 점유한다는 것입니다. OP의 서버가 멈 추면 포트 *가 해제됩니다. 적어도 OS는 더 이상 듣는 사람이 없다고 봅니다. 'SO_REUSEADDR' 옵션이 활성화되어 있으므로, 활성 청취자가 없다면 누구나 바인딩 할 수 있습니다. –

+0

나를 생각하게 만든 사실은 OP가 묘사 한 체계적인 행동입니다. SO_REUSEADDR은 포트가 해제 된 후에 누군가가 포트에 바인드하도록하는 것이 사실이지만, 포트를 해제하자마자 suddendly가 실행되는 것이 가능한가? – FredMaggiowski

+0

'ascd'가 OP의 서버가 멈추자 마자 포트를 잡으면'ascd'가 특별히 사용하기를 원하고 공격적으로 잡으려고합니다.이는'ascd '가 다른 서비스와 관련된 포트를 점유하지 않을 것이라는 관찰에 의해 지원됩니다. –