Результаты некоторых экспериментов:
Вот так изменил немного код:
while (1)
{
bzero(&clnt_addr, sizeof(clnt_addr));
addrlen=sizeof(clnt_addr);
CSocket=accept(SSocket, (struct sockaddr *)&clnt_addr, &addrlen);
if (CSocket<0)
printf(String, "Error accept()");
else
{
sprintf(String, "New connect (%d). IP=%s", CSocket, inet_ntoa(clnt_addr.sin_addr));
printf("%s", String);
switch (fork())
{
case 0:
close(SSocket);
Result=read(CSocket, Buffer, sizeof(Buffer));
if (Result<0)
printf("Error read");
else printf(Buffer);
close(CSocket);
exit(0);
break;
case -1:
printf("Error fork()\n");
break;
default:
close(CSocket);
break;
}
}
}
т. е. после того, как клиент что-нибудь присылает, связь с ним разрывается и процесс уничтожается.
Есть клиент, написанный на делфи. По нажатию на кнопку "Button1" происходи соединение с сервером. По нажатию на "Button2" происходит отправка серверу строки "Proverka".
Такие результаты экспериментов (результаты вывожу в виде тех строк, которые отображаются на экране функциями printf):
Запускаю три копии клиентов.
Подключение клиентом 1: New connect (4) IP=192.168.0.1
Подключение клиентом 2: New connect (4) IP=192.168.0.2
Отправка клиентом 1: Proverka
Подключение клиентом 3: Никакого текста не выводится!!!!!
//разрыв - для описания далее
Отправка клиентом 2: ProverkaNew connect (4) 192.168.0.1
Т. е. после того, как произошел разрыв хотя-бы с одним клиентом, новое соединение "не принимается".
И лишь после того, как разорвалась связь со всеми предыдущими клиентами - происходит связь с новым клиентом.???
И что еще интерестно, если в разрыв вставить:
Отправка клиентом 3; Отправка клиентом 3; Отправка клиентом 3;
т. е. три раза отправить третим клиентом, то получается следующее (текст для замены после разрыва):
Отправка клиентом 2: ProverkaNew connect (4) 192.168.0.1
ProverkaProverkaProverka
Т. е., как я понимаю, клиент три раза отправляет, т. к. со стороны сервера соединение не разорвано. И лишь после приема соединения принимаются все три пакета.
Вот так. Надеюсь, Вы поняли то, что я хотел сказать.
И еще: запускал свою прогу как демона и смотрел список процессов утилиткой ps.
Так вот, основной процесс не убивается!!!