2014-01-15 2 views
3

Я работал над простой клиентской серверной программой с целью создания чат-программы. Я новичок в программировании сокетов на C. Я узнал, что для обслуживания нескольких клиентов серверу необходимо разветвлять новый процесс каждый раз, когда клиент подключается. Каждый раз, когда клиент запрашивает соединение, функция accept() возвращает идентификатор дескриптора, а после fork() родительский элемент закрывает идентификатор.Зачем нам нужно создавать разные процессы для каждого клиента на параллельном сервере в C?

Вместо этого я не закрывал идентификатор, чтобы каждый новый клиент получал новый символ, когда вызывается accept().

nsockfd = accept(lsockfd, (struct sockaddr *) &cli_addr, &cli_len); 

теперь это хранится в 2-х переменных:

if (client1 < 0) 
    { client1 = nsockfd; 
     printf("if loop %d\n",nsockfd); 
    } 
    else 
    { client2 = nsockfd; 
     printf("else loop %d\n",nsockfd); 
    } 

Теперь остальная часть кода

 snprintf(buf, sizeof(buf), "Hi client1 Nice to meet you.",inet_ntoa(cli_addr.sin_addr)); 

     ret = send(client1, buf, strlen(buf), 0); 
     if (ret == -1) { 
      perror("Error sending message"); 
      exit(1); 
       } 
     printf("SRV - %s\n", buf); 
     strcpy(buf,""); 
     snprintf(buf, sizeof(buf), "Hi client2 Nice to meet you.",inet_ntoa(cli_addr.sin_addr)); 
     if(client2 > 0)  
     {ret = send(client2, buf, strlen(buf), 0); 
     if (ret == -1) { 
      perror("Error sending message"); 
      exit(1); 
       } 
     printf("SRV - %s\n", buf); 
     strcpy(buf,""); 

Здесь код работает, как предполагалось; каждый клиент печатает только одно из операторов.

Если это безупречный метод, почему он учит, что для обслуживания каждого клиента должен использоваться fork().

Я работаю над локальным хостом? Это причина, по которой этот код работает для меня?

+1

'fork()' новый процесс для каждого клиента - это ** один путь. Как вы обнаружили, похоже, есть и другие способы. – alk

+1

+1 для очень хорошего первого вопроса, используя OP, предоставленное форматирование и фактический код с хорошо сформированными вопросами. Продолжайте публиковать! Всем удачи. – shellter

+0

@alk okay, есть ли что-то не так с подходом, особенно если я хочу создать чат-систему –

ответ

7

Это не параллельный сервер, если вы не fork() или не обрабатываете соединение в потоке (new?). Это определение параллельного сервера.

Если я правильно читаю ваш код, то у вас есть простой последовательный сервер. Он может обрабатывать только одно соединение за раз. Это нормально, если вычисление, требуемое для каждого ответа, минимально, как в вашем примере. Это не очень хорошо, если вычисление требует больших усилий - например, доступ к диску или базе данных.

Обратите внимание, что последовательный дизайн сервера является полностью законным. Это тоже параллельный дизайн сервера. Они должны применяться к различным рабочим нагрузкам. Как правило, параллельный сервер будет обрабатывать большие объемы трафика лучше, чем последовательный сервер. Представьте, что Google использовал последовательные серверы для ответа на запросы на поиск!

Другая конструкция использует пул потоков или пул процессов с одним потоком или процессом, обрабатывающим работу с другими потоками или процессами. Это сложнее написать, чтобы они работали хорошо.

+0

все в порядке, но я до сих пор не понимаю, что, поскольку я пытаюсь создать чат-систему, и поскольку для каждого клиента я буду создавать новый процесс, я должен закрыть sockid, возвращаемый accept() каждый раз в процессе родительского сервера до того, как поступит новый запрос клиента, или если они закрывают их только до выхода из программы. –

+0

Просто, чтобы убедиться, весь фрагмент, который я предоставил, находится в бесконечном цикле, и я запустил 2 клиента и получил выходы как интенсивные, одно из сообщений на клиента.Если один процесс может это сделать, тогда почему мы не используем их как таковые. Пожалуйста, сделайте комментарий о том, создадут ли проблемы, когда я создам блокирующие вызовы, такие как recv() –

+1

@AmrithKrishna: Представьте, что у вас есть дюжина или hundrerds или даже тысячи клиентов, желающих пообщаться. – alk