Страниц: 1 [2]
  Печать  
Автор Тема: HTTP1.1: Запрос GET  (Прочитано 15075 раз)
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #15 : Июня 06, 2003, 12:05:00 pm »


Мне нужно опрашивать сервер на предмет поступления новых данных в XML формате, приблизительно 1 раз в секунду. Дают эти данные по HTTP. 1.0 - каждый раз нужно сокет создавать - писать - читать - закрывать.
В 1.1 достаточно один раз создать - сколко надо писать - читать - в конце работы закрыть.


http://httpd.apache.org/docs/keepalive.html

However, Keep-Alive support only is active with files where the length is known beforehand. This means that most CGI scripts, server-side included files and directory listings will not use the Keep-Alive protocol. While this should be completely transparent to the end user, it is something the web-master may want to keep in mind. I.e. the web server keeps the connection alive when the browser is fetching static HTML pages.
Записан

romqq
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #16 : Июня 06, 2003, 05:32:00 pm »



However, Keep-Alive support only is active with files where the length is known beforehand. This means that most CGI scripts, server-side included files and directory listings will not use the Keep-Alive protocol. While this should be completely transparent to the end user, it is something the web-master may want to keep in mind. I.e. the web server keeps the connection alive when the browser is fetching static HTML pages.


В telnet все работает как надо, со всеми Keep-Alive и т.д., как должно быть. По - видимому, нужно установить setsockopt() с какими-то параметрами, с какими - не знаю. Никто не в курсе?

[ Это Сообщение было отредактировано: romqq в 2003-06-06 14:32 ]
Записан
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 261


Просмотр профиля
« Ответ #17 : Июня 06, 2003, 08:09:00 pm »


В telnet все работает как надо, со всеми Keep-Alive и т.д., как должно быть. По - видимому, нужно установить setsockopt() с какими-то параметрами, с какими - не знаю. Никто не в курсе?

[ Это Сообщение было отредактировано: romqq в 2003-06-06 14:32 ]

не надо никаких дополнительных флагов:

include <stdio.h>
#if defined(linux) || defined (__QNX__)
#include <netdb.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#elif defined(WIN32)
//#include <windows.h>
#include <winsock2.h>
int Initialize()
{
 WORD wVersionRequested;
 WSADATA wsaData;

 wVersionRequested=MAKEWORD(2,0);
 if (WSAStartup(wVersionRequested,&wsaData)!=0)
   return 0;

 return 1;
}
#endif

char* req = "GET / HTTP/1.1
"
"Host:192.168.1.110:80
"
"User-agent: Search Engine
"
"Accept: */*
"
"Connection: Keep-Alive

";

int main(int arfc, char* argv[])
{ int sock, port = 80;
 struct sockaddr_in name;
 struct hostent* hbn;
 char   data[64000];
 int size = sizeof(name);
 int res, i;
 char* addr = "192.168.1.1";

#ifdef WIN32
 Initialize();
#endif

 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
 {
#ifdef WIN32
   errno = WSAGetLastError();
#endif
   perror("socket");
   exit(1);
 }
 if ((hbn = gethostbyname(addr)) == NULL)
//  if ((hbn = gethostbyname(argv[1])) == NULL)
 {
#ifdef WIN32
   errno = WSAGetLastError();
#endif
   perror("gethostbyname :");
   exit(2);
 };

 name.sin_family = AF_INET;
 name.sin_addr.s_addr = *(long*)hbn->h_addr;
 //port = atoi(argv[2]);

 name.sin_port = htons(port);

 res = connect(sock, (struct sockaddr*)&name, sizeof(name));
 if (res == -1)
 {
#ifdef WIN32
   errno = WSAGetLastError();
#endif
   perror("connect :");
   exit(3);
 };

 for (i = 0; i < 3; i++)
 { res = send(sock, req, strlen(req), 0);
   if (res == -1)
   {
#ifdef WIN32
     errno = WSAGetLastError();
#endif
     perror("send :");
     exit(4);
   };
   memset(data, 0, sizeof(data));
   res = recv(sock, data, 64000, 0);
   if (res == -1)
   {
#ifdef WIN32
     errno = WSAGetLastError();
#endif
     perror("recv :");
     exit(5);
   };

   printf("%s
", data);
 }
#if defined (WIN32)
 closesocket(sock);
#else
 close(sock);
#endif

 return 0;
}

Записан
romqq
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #18 : Июня 06, 2003, 10:40:00 pm »

Коды программ похожи, за исключением того, что у меня read в while() стоит - могут сообщения очень большие быть. А сокет на готовность чтения я не проверяю, read получает данные, пока они есть, потом в пустой сокет втыкается и стоит, ждет. В общем, добавил setsockopt(SOL_SOCKET, SO_RCVTIMEO,...) и проверку FD_ISSET(sock, &readf). Заработало, вроде. По - моему, нормальное решение, из учебников:)
Записан
vlad
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #19 : Июня 07, 2003, 10:21:00 am »


romqq пишет:
... read получает данные, пока они есть, потом в пустой сокет втыкается и стоит, ждет. ... По - моему, нормальное решение, из учебников:)

Читать данные из сокета пока они есть - НЕ есть нормальное решение. Работать такое хозяйство будет только в локалке (и то может не всегда).
Записан
romqq
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #20 : Июня 07, 2003, 07:38:00 pm »


Читать данные из сокета пока они есть - НЕ есть нормальное решение. Работать такое хозяйство будет только в локалке (и то может не всегда).

Да, сижу, буквари штудирую.
Записан
Страниц: 1 [2]
  Печать  
 
Перейти в: