2012-05-15 3 views
0

현재 인터넷을 통해 C 언어로 클라이언트/서버 응용 프로그램을 만들고 있습니다. 서버는 클라이언트로부터 새로운 연결을 계속 수신합니다. 현재 클라이언트를 청취하고 있지만 일단 클라이언트가 연결되면 서버는 계속 클라이언트를 청취하지 않습니다. 다음은 클라이언트와 연결할 서버 측 코드를 묘사 : 나는 가정하고클라이언트/서버 C 연결

int sockfd = socket(AF_INET, SOCK_STREAM, 0); 

struct sockaddr_in sockaddr, cliaddr; 
bzero(&sockaddr, sizeof(struct sockaddr_in)); 
bzero(&cliaddr, sizeof(struct sockaddr_in)); 

    sockaddr.sin_family = AF_INET; 
    sockaddr.sin_addr.s_addr = INADDR_ANY; 
    sockaddr.sin_port = ntohs(atoi(argv[1])); 

if(bind(sockfd, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) <0) { 
    printf("error binding socket: %d\n", errno); 
    exit(1); 
} 

printf("binded to %d : %d\n", sockaddr.sin_addr.s_addr, htons(sockaddr.sin_port)); 

listen(sockfd,5); 
socklen_t clilen = sizeof(cliaddr); 
int newsockfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen); 
    if (newsockfd < 0) 
     error("ERROR on accept"); 

printf("server connected to %d:%d\n", cliaddr.sin_addr.s_addr, htons(cliaddr.sin_port)); 

내가 일단 연결이 설정된 포크됩니다 스레드의 형태를 만들어야합니다. 하지만 난

답변

3

다음 사항이 도움이 될 수 있습니다 .. 그것을 구현하는 방법을 알고

해달라고 어떤 도움이 크게 감사한다 :

  1. 당신은, 루프에서 전화를 받고 당신이 있어야합니다 그래서 하나의 연결을 승인 한 후 더 많은 연결을 허용하기 위해 다시 되돌아 갈 수 있습니다.
  2. 각 연결을 별도로 처리하려면 pthread_create or some similar thread creation APIs을 사용하여 스레드를 만들 수 있습니다.
  3. Non-Blocking sockets을 사용하면 동일한 스레드에서 다중 연결을 쉽게 처리 할 수 ​​있습니다.
+0

귀하의 회신에 감사드립니다 ... 귀하가 지적한 다음 점에 대해 더 자세히 살펴 보겠습니다 – user1317277

1

당신은 배우고이 질문에 동시 서버를 작성하는 예는 여러 가지 방법으로 설명하기 어려운 C.에 동시 서버를 개발하는 방법을 이해하기 위해 다음과 같은 도서를 수집 할 수 있습니다. 이 책의 예제 소스 코드는 다운로드 가능하므로 책이 없어도 동일한 URL에서 찾을 수 있습니다. 코드를 공부하면 어떻게 작동하는지 볼 수 있습니다.

UNIX Network Programming, Volume 1, Second Edition: Networking APIs: Sockets and XTI

이 책은 소켓 프로그래밍에 대해 알고 싶은 거의 모든 것을 다루고 있습니다.

+0

귀하의 도움에 감사드립니다 – user1317277

+0

안녕하세요. UNIX 시스템/네트워크 프로그래밍과 관련된 논의가 필요하다면 [email protected]에서 ping을 할 수 있습니다. 언급 된 책에서 네트워크 프로그래밍을 배웠고 이제는 네트워크 프로그래밍에 대한 지식이 풍부하며 현재는 프로젝트의 특정 요구에 맞게 웹 서버를 작성하고 있습니다. 가능하면 아이디어를 도울 수 있습니다. – Ayub