Непонятки с fork() в UNIX.....
//Код, подготовливающий сокет, для прослушивания подключений.
...
while (1)
{
bzero(&clnt_addr, sizeof(clnt_addr));
addrlen=sizeof(clnt_addr);
CSocket=accept(SSocket, (struct sockaddr *)&clnt_addr, &addrlen);
if (CSocket<0)
printf("Error accept()\n");
else
{
switch (fork())
{
case 0:
close(SSocket);
SomeFunc(CSocket, inet_ntoa(clnt_addr.sin_addr));
close(CSocket);
exit(0);
case -1:
printf("Error fork()\n");
default:
close(CSocket);
}
}
}
Примерное содержимое функции SomeFunc
int SomeFunc(....)
{
....
//блок А, по выполнению которого в любом случае в конце вызывается return 0
//блок Б, представляющий из себя бесконечный цикл
}
Ситуация 1:
Подключение 1 с выходом по блока А
Подключение 2 с выходом по блоку А
Все работает Ок.
Ситуация 2:
Подключение 1 с зацикливанием по блоку Б
Подключение 2 с зацикливанием по блоку Б
Все работает Ок.
Ситуация 3:
Подключение 1 с зацикливанием по блоку Б
Подключение 2 с выходом по блоку А
И вот в этой ситуации Подключение 1 продолжает работать, а больше никакие подключения не принимаются, как будто завершается основной процесс.
???
И еще непонятка:
Допустим, при подключении 1 выделяется сокет 4; затем при подключении 2 выделяется опять-же сокет 4. Почему так происходит? Хотя если убрать строки с close(CSocket), то при каждом подключении выделятся новый сокет.
Цитата:
Originally posted by Cker
Имеется следующий код:
...
И еще непонятка:
Допустим, при подключении 1 выделяется сокет 4; затем при подключении 2 выделяется опять-же сокет 4. Почему так происходит? Хотя если убрать строки с close(CSocket), то при каждом подключении выделятся новый сокет.
Имеется следующий код:
...
И еще непонятка:
Допустим, при подключении 1 выделяется сокет 4; затем при подключении 2 выделяется опять-же сокет 4. Почему так происходит? Хотя если убрать строки с close(CSocket), то при каждом подключении выделятся новый сокет.
Думается, что раз сокет был закрыт - то система считает его свободным, и что тогда может ей помешать выделить для работы именно его (снова).
А если (что мне кажется неверным) close(CS) убрать, то при интенсивном коннекте - сокеты когда-нибудь кончатся :)))