2012-10-06 2 views
1

많은 클라이언트를 수용하도록 서버를 수정하려면 어떻게해야합니까?서버가 많은 클라이언트를 수용합니다.

void Serveur() 
{//Declaring process variables. 
    int server_sockfd, client_sockfd; 
    int server_len ; 
    int rc ; 
    unsigned client_len; 
    struct sockaddr_in server_address; 
    struct sockaddr_in client_address; 

    //Remove any old socket and create an unnamed socket for the server. 
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    server_address.sin_family = AF_INET; 
    server_address.sin_addr.s_addr = htons(INADDR_ANY); 
    server_address.sin_port = htons(1111) ; 
    server_len = sizeof(server_address); 

    rc = bind(server_sockfd, (struct sockaddr *) &server_address, server_len); 
    printf("RC from bind = %d\n", rc) ; 

    //Create a connection queue and wait for clients 
    rc = listen(server_sockfd, 5); 
    printf("RC from listen = %d\n", rc) ; 

    client_len = sizeof(client_address); 
    client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len); 
    printf("after accept()... client_sockfd = %d\n", client_sockfd) ; 
    char ch[BUFFER_TAILLE]; 
} 
+0

당신은 무엇을 시도 했습니까? – tomahh

+0

코드의 나머지 동안 (1) \t { \t \t \t \t의 printf ("서버 \ n을 대기"); \t \t \t \t rc = read (client_sockfd, ch, 3); printf ("클라이언트의 문자 = % c \ n", 채널 [0]); \t \t // printf ("RC from read = % d \ n", rc); \t \t \t \t if (ch [0] == 'X') break; sleep (10); \t \t ch [0] ++; \t \t write (client_sockfd, ch, 1); \t} \t printf ("server exiting \ n"); \t \t 닫기 (client_sockfd); – user1543915

+0

@Tom : 많은 클라이언트를 허용하도록 서버의 코드를 변경하고 싶습니다. – user1543915

답변

1

두 가지 해결책이 있습니다.

  • 첫 번째는 다른 프로세스/스레드에서 각 클라이언트를 처리하는 것입니다. 자세한 내용은 link을 따르십시오 (다중 연결 부분 처리).

  • 두 번째 것은 selecthandle each client in your server loop입니다.

0

것은 당신이 일의 몇 필요 다수의 클라이언트 받아 들일 수 있으려면 모든 모든 소켓의

  1. 먼저해야 비 차단, 즉 당신이 호출 할 때 예를 들어, read/recv 클라이언트 소켓에는 차단되지 않지만 읽을 내용이없는 경우 즉시 반환됩니다.
  2. select 또는 poll (또는 유사한) 기능을 사용하여 준비가 된 소켓을 알아야합니다.
  3. 연결된 모든 클라이언트를 추적해야합니다. 이것은 실제 소켓을 포함하여 각 클라이언트에 대한 정보가 들어있는 구조체의 링크 된 목록을 유지함으로써 가장 간단하게 수행됩니다.
  4. 이벤트 루프. 예를 들어 계속 전화해야합니다. select을 반복하여 서버 소켓이나 클라이언트 소켓이 "준비"되어 있는지 (즉, 수신 할 수있는 입력이 있는지) 확인하십시오.

인터넷에서 수행하는 방법에 대한 예제와 튜토리얼이 많이 있습니다.

위에서 설명한 방법 외에 다른 방법도 있습니다. 가장 일반적인 방법은 소켓을 계속 차단하고 새 연결이 도착하면 클라이언트 연결을 처리 할 새 스레드 또는 프로세스를 만드는 것입니다. 이 방법은 클라이언트 연결이 짧거나 활성 연결이 많지 않을 것으로 예상되는 웹 서버와 같은 서버에서 가장 일반적입니다.

프로세스/스레드가 다중 연결을 처리하는 것과 같은 방법을 물론 결합 할 수 있습니다.

관련 문제