Ключевые слова:socket, buffer, (найти похожие документы)
_ RU.UNIX.BSD (2:5077/15.22) _____________________________________ RU.UNIX.BSD _
From : Michael Levitin 2:5020/400 10 Aug 98 11:54:28
Subj : Qst - daemon with sockets (буферизация)
________________________________________________________________________________
From: [email protected] (Michael Levitin)
Greetings !
Hе сможет ли кто-нибудь ткнуть меня носом : что я делаю неправильно...
Hаписалась некая програамка, с использованием sockets , которая повисает на
xx порту и обслуживает входящие соединения.
Сделано это стандартным образом :
......
ля-ля-ля....
создаем сокет , биндим его.......
.............
listen (s,5); /// max 5 connect
for (;;)
{
if ((g = accept(s,0,0)) < 0)
{
perror("accept");
exit(1);
}
// printf(" Connect from host
if ((pid = fork()) == -1 )
{
perror (" fork");
exit(1);
}
if ( pid == 0 )
{
dup2(g,1);
dup2(g,0);
printf("100 ready.\r\n");
cmd(); // функция, которая обрабатывает ввод.вывод...............
close (g);
exit(0);
}
}
Если эту задачку запустить из командной строки, то все ОК -
захожу telnet-ом на порт, вижу отклик, ввожу что-то, на это что-то
тож отклики вижу соответственный......
Hо вот если на самом верху написать daemon(0,0);,
то опаньки - с stdin, stdout начинает твориться что-то с чем-то.....
Это понятно и про это написано в man к daemon.
Ладно.Я пытаюсь этот сокет (g который ) c помощью fdopen ассоциировать с
FILE * потоком -
f =fdopen(g,"rw");
и после этого, соответственно, использую fprintf & fscanf.
Hо - когда я подключаюсь telnet-ом, в ответ тишина - вводится все, что
угодно, но отклика не видно, т.е. fprintf не работает.
А вот если набрать команду, означающую "конец соединения", после этого
на экран вываливается все, что должен был напечатать fprintf....
ТО есть, получается, что сокет работает только на ввод, и лишь когда я
его закрываю ( close(g) after cmd() ) - вываливается весь буфер.....
И вот что-то никак не получается все эти симптомы сложить вместе
и сделать правильный вывод :-(
Понимаю, что здесь нечто простейшее, но не могу найти.......
Ткните носом, плз. А то обидно как-то :-)
А второй нюанс - при таком методе обработки соединений, начинают плодиться
"висяки" - зомби процессы... Почему ? Ведь стоит же exit....
--
CU, Michael.
Michael Levitin
nic-hdl: MLL10-RIPE
mailto:[email protected]--- ifmail v.2.14dev2 * Origin: Trust Ltd. (2:5020/400@fidonet)
_ RU.UNIX.BSD (2:5077/15.22) _____________________________________ RU.UNIX.BSD _
From : Anton Petrusevich 2:5004/16.29 10 Aug 98 17:35:22
Subj : Re: Qst - daemon with sockets
________________________________________________________________________________
>>>>> "ML" == Michael Levitin writes:
ML> и после этого, соответственно, использую fprintf & fscanf. Hо - когда
ML> я подключаюсь telnet-ом, в ответ тишина - вводится все, что угодно, но
ML> отклика не видно, т.е. fprintf не работает. А вот если набрать
ML> команду, означающую "конец соединения", после этого на экран
ML> вываливается все, что должен был напечатать fprintf.... ТО есть,
ML> получается, что сокет работает только на ввод, и лишь когда я его
ML> закрываю ( close(g) after cmd() ) - вываливается весь буфер.....
Отключи буферизацию stdout.
--
Best regards, Anton.
the butane lighter causes the pincushioning
--- Gnus v5.5/XEmacs 20.4 - "Emerald" * Origin: Omskelecom (2:5004/16.29@fidonet)