H>> n = write(sock, reply, strlen(reply)); P>первый параметр.
Да, я уже потом заметил — банальная ошибка не по невнимательности, а по отсутствию элементарного представления о том, что делаешь
P>на сем заканчиваю что-либо отвечать в этом посте.
Спасибо — помогли во многом разобраться.
Whoa...I did a 'zcat /vmlinuz > /dev/audio' and I think I heard God...
Теперь вопрос по процессам:
Предположим, я хочу, чтобы родительский процесс моей программы принимал запросы от клиентов (браузеров), и создавал для каждого из них дочерний процесс, который, в свою очередь, обрабатывал запрос и завершался, т.е.:
int main (int argc, char * const argv[]) {
sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (struct sockaddr*)&addr_info, sizeof(addr_info));
listen(sock, 1);
for (;) {
ret_addr = accept(sock, (struct sockaddr*)&addr_info, (socklen_t*)&add_len);
if (!fork()) { // child
close(sock);
// read
do {
n = read(ret_addr, buf, BUF_SIZE);
buf[n] = '\0';
cout << buf;
}
while (n==BUF_SIZE);
reply = "Child process: ";
out << getpid();
reply+= out.str();
n = write(ret_addr, reply.c_str(), reply.length());
if (errno) {perror("Errno: ");}
exit(0);
}
else { // parent
close(ret_addr);
}
}
close(sock);
return 0;
}
Такая программа обрабатывает первый запрос нормально, второй запрос обрабатывает, но в errno записывает код ошибки Bad file descriptor, ну а третий запрос вообще не обрабатывает.
Что тут не так?
Whoa...I did a 'zcat /vmlinuz > /dev/audio' and I think I heard God...
Здравствуйте, Handler,
ты не представляешь какой поимеешь рак моцга работая с голыми сокетами 8)
за 9 дней ты написал то что написал. впечатляет.
при использовании asio это пишется за 6 минут. и искаропки тебе сразу асинхронность+очередь_обработчиков+возможность использовать пул потоков, и много-много всякой вкуснятинки
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Оставьте на время попытки написать эту программу и займитесь теоретической составляющей.
Здесь столько ошибок, как технических, так и общего характера, которые произрастают из-за
недостаточного понимания предметной области, что можно очень долго продолжать эту тему, да
так ничего в конечном счете не получить.
Навскидку:
Принимая HTTP-поток, нельзя знать сколько байт отправит клиент.
Я, конечно, не знаю Ваших клиентов, но даже чтобы "проглотить" только заголовки, 256 байт недостаточно,
ибо один Cookie может достигать 4096 байт. read может банально повиснуть в цикле, потому что в HTTP/1.1
клиент не обязан закрывать свой конец соединения после отправки запроса, да и вообще HTTP нужно парсить
на лету, а не так как Вы это пытаетесь делать. А еще клиенты могут создавать два и более соединений
одновременно, причем одно из них будет оставаться пассивным некоторое время (нечто подобное происходит в
браузерах при запросе favicon). HTTP-сервер не должен поэтому быть синхронным, иначе он будет бесконечно
ждать данных по одному каналу, в то время как нужно обрабатывать другие. В ответе "403 forbidden" тоже
может быть тело, а в приведенном примере его нет, как нет и двух CRLF после статусной строки. Я уже не
говорю про всякие Content-Length, без которых клиент вообще не сможет прочитать тело ответа.
Это вкратце по мат.части HTTP.
Теперь по сокетам.
Передавать в listen единицу — автоматически обрекать свой сервер на простаивание в ожидании.
И это что у Вас ? Рестарт серверного сокета на каждый входящий коннект ? Оригинально, но не более.
Создавать, кстати, нужно дочерние потоки, а не процессы, а еще лучше задействовать пул потоков.
Ну и я не удивляюсь, что сервер не работает как надо, потому что реализация корявая, да еще
ошибки не проверяются, похоже.
Пожалуйста, без обид.
Это не укор, а попытка "дать пинка" в нужном направлении, в чем мы все иногда нуждаемся.
Разберитесь хотя бы с тем, как правильно писать простые серверы на сокетах (лучше асинхронные),
после этого многие вопросы отпадут, а такие грубые ошибки перестанут встречаться.
O>Создавать, кстати, нужно дочерние потоки, а не процессы, а еще лучше задействовать пул потоков.
В линукс нет понятия потоков — можно создать только процесс (все зависит от идеологии создаваемого процесса).
O>Пожалуйста, без обид. O>Это не укор, а попытка "дать пинка" в нужном направлении, в чем мы все иногда нуждаемся. O>Разберитесь хотя бы с тем, как правильно писать простые серверы на сокетах (лучше асинхронные), O>после этого многие вопросы отпадут, а такие грубые ошибки перестанут встречаться.
Именно это мне сейчас и нужно — поэтому я и продолжаю писать в эту тему
Whoa...I did a 'zcat /vmlinuz > /dev/audio' and I think I heard God...
Здравствуйте, Handler, Вы писали: H>В линукс нет понятия потоков — можно создать только процесс (все зависит от идеологии создаваемого процесса).
наглая ложь.
так было в ядрах 2.4.х
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Handler, Вы писали: H>>В линукс нет понятия потоков — можно создать только процесс (все зависит от идеологии создаваемого процесса). X>наглая ложь. X>так было в ядрах 2.4.х
Вы имеете ввиду pthread_* ?
Согласен, ошибся. Я вообще в многопоточности ноль — это мой дебют.
По поводу boost.asio — не могу скомпилировать первый же пример
Выдает ошибки на этапе линковки — я не могу правильно собрать и прикрутить библиотеку boost.
Здравствуйте, Handler, Вы писали: H>Вы имеете ввиду pthread_* ?
угу.
H>По поводу boost.asio — не могу скомпилировать первый же пример H>Выдает ошибки на этапе линковки — я не могу правильно собрать и прикрутить библиотеку boost. H>"boost::system::generic_category()" H>"boost::system::system_category()"
к линковке добавь boost_system
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, Аноним, Вы писали:
А>libboost_system.a А>libboost_filesystem.a
А>Все это есть — только счастья нет. А>Значит, что-то неправильно сделал: или библиотеку не так собрал, или подключил неправильно.
для начала разберись с основами сборки/линковки. потом программирование.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Аноним, Вы писали: А>>Что такое boost_system ? X>библиотека. libboost_filesystem
мля, libboost_system
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[20]: C++ listen tcp socket
От:
Аноним
Дата:
08.10.11 07:13
Оценка:
Ну и здорово: библиотеку в глаза не вижу, как слинковать проект с ней — тоже не знаю, пойду почитаю windows для чайников
Re[21]: C++ listen tcp socket
От:
Аноним
Дата:
09.10.11 22:03
Оценка:
Все офф мануалы прочитал, как по-писаному все сделал, библиотеки такой у меня нет, нигде ее найти не могу — интересно, как все работают с ней кроме меня?
Здравствуйте, Handler, Вы писали:
H>Если мы слушаем http-port, мы должны выключить веб-сервер, запущенный на этой же машине, и я понимаю, почему. Но меня смущает тот факт, например, что в это же время наш ( и не только наш) протокол слушает iptables (netflter). Возможно, они могут слушать его одновременно потому, что netfilter работает в ядре, тогда как быть с tcpdump? Получается, tcpdump может слушать вместе с apache, а моя программа — нет?
Здесь уместна следующая аналогия: у вас и у вашей престарелой соседки, очевидно, разные номера телефонов, чтобы люди, которые звонят кому-то из вас, попадали туда, куда целились. Однако КГБ может при этом слушать вас обоих, даже не имея (выделенного для этого) номера телефона
Здравствуйте, Аноним, Вы писали:
А>Все офф мануалы прочитал, как по-писаному все сделал, библиотеки такой у меня нет, нигде ее найти не могу — интересно, как все работают с ней кроме меня?
о чем речь?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)