Программирование http соединений (нужна помощь)

Модератор: Модераторы разделов

edranovdenis
Сообщения: 135
ОС: main mdv2006

Программирование http соединений

Сообщение edranovdenis »

Изучая межпроцессное взаимодействие, не могу симитировать поведение http сервера. Сделал примитивную(учебную) прогу (bind, listen, accept, printf"ok"), посадил на 7000 порт. Затем сделал lynx 127.0.0.1:7000, но мой "сервер" даже не "услышал" запроса на соединение, т.е. никак не отреагировал. Кстати учебный "браузер" с "сервером" работает нормально, как и линкс с апачем. Подскажите, пожалуйста, на какую граблю я наступил и в каком направлении топать. Спасибо.

P.S. Исходники апача смотрел, пробираясь сквозь дебри кроссплатформенности, дошел до момента распада на нити, дальше меня пока не хватает(буду копать), но пришел к выводу, что механизм там впринципе тот же (сокеты).

P.P.S. юзаю apache2, исходники apache1.
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программирование http соединений

Сообщение elide »

телепаты в отпуске.
код показывай...
слава роботам!
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Программирование http соединений

Сообщение d_n_k »

:)
http ходит по tcp. на учишься принимать-передавать данные по tcp - научишься работать с http.

http - это всего лишь протокол, те описание формата обмена данными. читай спецификацию http.

а то что там с нитями работает, так это только для увеличения производительности :)

зы: учи tcp-сокеты
все сказанное есть имхо...
Спасибо сказали:
edranovdenis
Сообщения: 135
ОС: main mdv2006

Re: Программирование http соединений

Сообщение edranovdenis »

Вообще-то с tcp сокетами все вроде как впорядке, я же написал что мои "сервер" и "браузер" сообщениями обмениваются. Я не могу понять почему комманда accept никак не реагирует на попытку соединения браузерами lynx и firefox.

Вот код:
(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 соединений

Сообщение elide »

замени

Код: Выделить всё

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 соединений

Сообщение edranovdenis »

спасибо огромное!

кстати, в книжке по которой учусь об htons ни слова... книжка Кэйт Хевиленд "Системное программрование в UNIX", возможно потому, что там разбирается более старая версия UNIX(POSIX).

P.S. замечания учту. Ну теперь самое пора читать доки по http.
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали:
votan
Сообщения: 8
ОС: Mandriva 2006

Re: Программирование http соединений

Сообщение votan »

Такие вещи лучше по Стивенсу. Кста, недавно в "Питере" вышло 3-е издание по его следам.
Спасибо сказали:
edranovdenis
Сообщения: 135
ОС: main mdv2006

Re: Программирование http соединений

Сообщение edranovdenis »

Что-то не могу разобраться с командой send точнее с ее поведением. Оно сразу выкидывает пакет или несколько send'ов собираются в буфере, а пакет высылается только при заполнении?

Если отсылаются сразу, то не хочется засорять сеть мелкими пакетами, если буферизируются, то ответ сервера можно нагенерировать кучей send'ов не собирая его предварительно в своем буфере или динамической памяти.

Предполагаю, что они всетаки должны буферизироваться как и любая работа с файлами, но что тогда является сигналом для отправки собранного в буфере ответа?

P.S. Понимаю, что ответы могу найти в исходниках ядра (в гугле не нашел, плохо искал?), но думаю, что эта задачка пока не по силам...
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали:
edranovdenis
Сообщения: 135
ОС: main mdv2006

Re: Программирование http соединений

Сообщение edranovdenis »

Вроде как нашел:

Операции вывода (print, printf, syswrite — или send для сокета TCP) буферизуются на уровне операционной системы по так называемому алгоритму Нейгла. Если пакет данных отправлен, но еще не подтвержден, другие передаваемые данные ставятся в очередь и отправляются либо после набора следующего полного пакета либо при получении подтверждения.

Если я правильно понял, то можно делать send практически на каждое слово, системная буферизация разрулит? Хм... всетаки количество send желательно минимизировать.
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программирование http соединений

Сообщение elide »

почитай man 7 tcp. там достаточно подробно описано.
слава роботам!
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Программирование http соединений

Сообщение v04bvs »

edranovdenis писал(а): ↑
31.10.2006 12:46
Вроде как нашел:

Операции вывода (print, printf, syswrite — или send для сокета TCP) буферизуются на уровне операционной системы по так называемому алгоритму Нейгла. Если пакет данных отправлен, но еще не подтвержден, другие передаваемые данные ставятся в очередь и отправляются либо после набора следующего полного пакета либо при получении подтверждения.

Если я правильно понял, то можно делать send практически на каждое слово, системная буферизация разрулит? Хм... всетаки количество send желательно минимизировать.

Делай как удобнее, буферизация - не твоя забота.
Спасибо сказали:
edranovdenis
Сообщения: 135
ОС: main mdv2006

Re: Программирование http соединений

Сообщение edranovdenis »

комманда recv всегда будет ждать бесконечно долго?
как можно ограничить время ее ожидания?

(создание специального контролирующего процесса кажется черезчур громоздкой)
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Программирование http соединений

Сообщение v04bvs »

edranovdenis писал(а): ↑
18.12.2006 12:27
комманда recv всегда будет ждать бесконечно долго?
как можно ограничить время ее ожидания?

(создание специального контролирующего процесса кажется черезчур громоздкой)

можно сделать перед recv вызов alert, в этом случае через заданный промежуток времени придет SIGALARM, который прервёт вызов recv. После этого надо будет проанализировать значение errno. А вообще возможно вам стоит организовать всё через select.
Спасибо сказали:
edranovdenis
Сообщения: 135
ОС: main mdv2006

Re: Программирование http соединений

Сообщение edranovdenis »

спасибо.

(для других "первопроходцев" уточню: alarm(), SIGALRM)
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали: