Программирование http соединений (нужна помощь)
Модератор: Модераторы разделов
-
edranovdenis
- Сообщения: 135
- ОС: main mdv2006
Программирование http соединений
Изучая межпроцессное взаимодействие, не могу симитировать поведение http сервера. Сделал примитивную(учебную) прогу (bind, listen, accept, printf"ok"), посадил на 7000 порт. Затем сделал lynx 127.0.0.1:7000, но мой "сервер" даже не "услышал" запроса на соединение, т.е. никак не отреагировал. Кстати учебный "браузер" с "сервером" работает нормально, как и линкс с апачем. Подскажите, пожалуйста, на какую граблю я наступил и в каком направлении топать. Спасибо.
P.S. Исходники апача смотрел, пробираясь сквозь дебри кроссплатформенности, дошел до момента распада на нити, дальше меня пока не хватает(буду копать), но пришел к выводу, что механизм там впринципе тот же (сокеты).
P.P.S. юзаю apache2, исходники apache1.
P.S. Исходники апача смотрел, пробираясь сквозь дебри кроссплатформенности, дошел до момента распада на нити, дальше меня пока не хватает(буду копать), но пришел к выводу, что механизм там впринципе тот же (сокеты).
P.P.S. юзаю apache2, исходники apache1.
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: Программирование http соединений
http ходит по tcp. на учишься принимать-передавать данные по tcp - научишься работать с http.
http - это всего лишь протокол, те описание формата обмена данными. читай спецификацию http.
а то что там с нитями работает, так это только для увеличения производительности
зы: учи tcp-сокеты
все сказанное есть имхо...
-
edranovdenis
- Сообщения: 135
- ОС: main mdv2006
Re: Программирование http соединений
Вообще-то с tcp сокетами все вроде как впорядке, я же написал что мои "сервер" и "браузер" сообщениями обмениваются. Я не могу понять почему комманда accept никак не реагирует на попытку соединения браузерами lynx и firefox.
Вот код:
(server.c)
(client.c)
Вот код:
(server.c)
Код: Выделить всё
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet.h>
#include <signal.h>
#include <stdio.h>
int main(){
char c[512];
int sockfd, newsockfd;
struct sockaddr_in server={AF_INET,7000,INADDR_ANY};
int size=sizeof(struct sockaddr_in);
sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bind(sockfd,(struct sockaddr *)&server,size);
listen(sockfd,5);
newsockfd=accept(sockfd,0,0);
recv(newsockfd,&c,512,0);
puts(c);
close(sockfd); close(newsockfd);
return(0);
}(client.c)
Код: Выделить всё
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
int main(){
char c[512];
int sockfd;
struct sockaddr_in server={AF_INET,7000};
sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
connect(sockfd,(struct sockaddr *)&server, sizeof(struct sockaddr_in));
gets(c);
recv(sockfd,&c,512,0);
close(sockfd);
return(0);
}Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: Программирование http соединений
замени на и все-таки прочитай документацию, да.
и научись форматировать код так, чтоб об него не приходилось глаза ломать.
Код: Выделить всё
struct sockaddr_in server={AF_INET,7000,INADDR_ANY};Код: Выделить всё
struct sockaddr_in server={AF_INET, htons(7000) ,INADDR_ANY};и научись форматировать код так, чтоб об него не приходилось глаза ломать.
слава роботам!
-
edranovdenis
- Сообщения: 135
- ОС: main mdv2006
Re: Программирование http соединений
спасибо огромное!
кстати, в книжке по которой учусь об htons ни слова... книжка Кэйт Хевиленд "Системное программрование в UNIX", возможно потому, что там разбирается более старая версия UNIX(POSIX).
P.S. замечания учту. Ну теперь самое пора читать доки по http.
кстати, в книжке по которой учусь об htons ни слова... книжка Кэйт Хевиленд "Системное программрование в UNIX", возможно потому, что там разбирается более старая версия UNIX(POSIX).
P.S. замечания учту. Ну теперь самое пора читать доки по http.
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
-
votan
- Сообщения: 8
- ОС: Mandriva 2006
Re: Программирование http соединений
Такие вещи лучше по Стивенсу. Кста, недавно в "Питере" вышло 3-е издание по его следам.
-
edranovdenis
- Сообщения: 135
- ОС: main mdv2006
Re: Программирование http соединений
Что-то не могу разобраться с командой send точнее с ее поведением. Оно сразу выкидывает пакет или несколько send'ов собираются в буфере, а пакет высылается только при заполнении?
Если отсылаются сразу, то не хочется засорять сеть мелкими пакетами, если буферизируются, то ответ сервера можно нагенерировать кучей send'ов не собирая его предварительно в своем буфере или динамической памяти.
Предполагаю, что они всетаки должны буферизироваться как и любая работа с файлами, но что тогда является сигналом для отправки собранного в буфере ответа?
P.S. Понимаю, что ответы могу найти в исходниках ядра (в гугле не нашел, плохо искал?), но думаю, что эта задачка пока не по силам...
Если отсылаются сразу, то не хочется засорять сеть мелкими пакетами, если буферизируются, то ответ сервера можно нагенерировать кучей send'ов не собирая его предварительно в своем буфере или динамической памяти.
Предполагаю, что они всетаки должны буферизироваться как и любая работа с файлами, но что тогда является сигналом для отправки собранного в буфере ответа?
P.S. Понимаю, что ответы могу найти в исходниках ядра (в гугле не нашел, плохо искал?), но думаю, что эта задачка пока не по силам...
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
-
edranovdenis
- Сообщения: 135
- ОС: main mdv2006
Re: Программирование http соединений
Вроде как нашел:
Операции вывода (print, printf, syswrite — или send для сокета TCP) буферизуются на уровне операционной системы по так называемому алгоритму Нейгла. Если пакет данных отправлен, но еще не подтвержден, другие передаваемые данные ставятся в очередь и отправляются либо после набора следующего полного пакета либо при получении подтверждения.
Если я правильно понял, то можно делать send практически на каждое слово, системная буферизация разрулит? Хм... всетаки количество send желательно минимизировать.
Операции вывода (print, printf, syswrite — или send для сокета TCP) буферизуются на уровне операционной системы по так называемому алгоритму Нейгла. Если пакет данных отправлен, но еще не подтвержден, другие передаваемые данные ставятся в очередь и отправляются либо после набора следующего полного пакета либо при получении подтверждения.
Если я правильно понял, то можно делать send практически на каждое слово, системная буферизация разрулит? Хм... всетаки количество send желательно минимизировать.
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: Программирование http соединений
почитай man 7 tcp. там достаточно подробно описано.
слава роботам!
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Программирование http соединений
edranovdenis писал(а): ↑31.10.2006 12:46Вроде как нашел:
Операции вывода (print, printf, syswrite — или send для сокета TCP) буферизуются на уровне операционной системы по так называемому алгоритму Нейгла. Если пакет данных отправлен, но еще не подтвержден, другие передаваемые данные ставятся в очередь и отправляются либо после набора следующего полного пакета либо при получении подтверждения.
Если я правильно понял, то можно делать send практически на каждое слово, системная буферизация разрулит? Хм... всетаки количество send желательно минимизировать.
Делай как удобнее, буферизация - не твоя забота.
-
edranovdenis
- Сообщения: 135
- ОС: main mdv2006
Re: Программирование http соединений
комманда recv всегда будет ждать бесконечно долго?
как можно ограничить время ее ожидания?
(создание специального контролирующего процесса кажется черезчур громоздкой)
как можно ограничить время ее ожидания?
(создание специального контролирующего процесса кажется черезчур громоздкой)
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Программирование http соединений
edranovdenis писал(а): ↑18.12.2006 12:27комманда recv всегда будет ждать бесконечно долго?
как можно ограничить время ее ожидания?
(создание специального контролирующего процесса кажется черезчур громоздкой)
можно сделать перед recv вызов alert, в этом случае через заданный промежуток времени придет SIGALARM, который прервёт вызов recv. После этого надо будет проанализировать значение errno. А вообще возможно вам стоит организовать всё через select.
-
edranovdenis
- Сообщения: 135
- ОС: main mdv2006
Re: Программирование http соединений
спасибо.
(для других "первопроходцев" уточню: alarm(), SIGALRM)
(для других "первопроходцев" уточню: alarm(), SIGALRM)
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.