2012-11-08 2 views
0

멀티 클라이언트 소켓 프로그램,
을 쓰고 싶지만 accept 단계에서 불량 파일 기술자를 얻습니다.
코드를 수정하려면 어떻게해야합니까? 감사!
소켓 불량 파일 설명자

여기에 내 코드
http://codepad.org/q0N1jTgz
감사합니다!
여기 내 코드 부분입니다!

while(1) 
{ 
    struct sockaddr_in client_addr; 
    int addrlen = sizeof(client_addr); 

    /*Accept*/ 
    if(clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen) < 0) 
    { 
     perror("Accpet Error"); 
     close(sockfd); 
     exit(-1); 
    } 

    /*Fork process*/ 
    if(child = fork() < 0) 
    { 
     perror("Fork Error"); 
     close(sockfd); 
     exit(-1); 
    } 
    else if(child == 0) 
    { 
     int my_client = clientfd; 
     close(sockfd); 

     send(my_client, welcome, sizeof(welcome), 0); 

     while ((res = recv(my_client, buffer1, sizeof(buffer1), 0)) > 0) 
     { 
      string command(buffer1); 
      cout << "receive from client:" << command << ", " << res << " bytes\n"; 
      memset(buffer1, '\0', sizeof(buffer1));  
     } 
    } 

    close(clientfd); 

} 
+0

g++를 사용하는 경우 예컨대이 (http://stackoverflow.com/posts/13287359/edit)을 편집]하여 해당 코드의 관련 부분을 포함하십시오 -Wall-Wextra 플래그를 사용합니다. 코드 패드는 언제든지 사라질 것입니다. –

답변

1

는 가 먼저 childclientfd의 할당 주위에 괄호를 사용할 필요가 코드에서 몇 가지 버그가 있습니다.

라인 68

if((clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen)) < 0) 

로 변경해야하며 라인 76 추가로

if((child = fork()) < 0) 

해야 당신이해야 이미 청취 소켓을 닫은 이후 갈래 과정에서 return 또는 exit().

때문에 줄 끝에서 exit(0); 또는 return 0;를 추가 94

내가보기 엔 당신이 활성화 경고 코드를 컴파일 초기 할당 문제를 감지하는 것이 좋습니다. 당신이 gcc 또는

+0

대단히 감사합니다. 제게 매우 유용합니다. 코드를 수정하고 다시 시도해 보겠습니다. 감사!!!!!!!!!! – Andy

+0

지금 프로그램이 완벽하게 작동하지만 또 다른 문제는 clientfd가 항상 같은 번호이며 서버가 정확히 어떤 클라이언트가 메시지를 보내는지를 인식 할 수 없다는 것입니다. 어떻게 해결할 수 있습니까? 감사! – Andy

+0

@ ChengChung-Hao 클라이언트를 구별하는 유일한 것은 getpeername()을 통해 소켓 FD에서 얻을 수있는 IP 주소 : 포트입니다. – EJP