Я работал над простой клиентской серверной программой с целью создания чат-программы. Я новичок в программировании сокетов на 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()
.
Я работаю над локальным хостом? Это причина, по которой этот код работает для меня?
'fork()' новый процесс для каждого клиента - это ** один путь. Как вы обнаружили, похоже, есть и другие способы. – alk
+1 для очень хорошего первого вопроса, используя OP, предоставленное форматирование и фактический код с хорошо сформированными вопросами. Продолжайте публиковать! Всем удачи. – shellter
@alk okay, есть ли что-то не так с подходом, особенно если я хочу создать чат-систему –