Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 348

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Решил научиться пользоваться WINSOCK'ом в Delphi. Прошло около получаса попыток и гугления информации и чужих примеров, как я понял, что тут мне не справиться без помощи экспертов :\
В приложении к вопросу представлен мой код, который должен просто скачать по протоколу HTTP и вывести в консоль текст страницы, путь которой указан в константе HOST. Проблема заключается в том, что от сервера вообще ничего не приходит.
Прошу помочь и показать, где у меня ошибка. Заранее благодарю.

Приложение:
  1. program htmlget;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils,
  7. WinSock;
  8.  
  9. var
  10. sock: TSocket;
  11. addr: sockaddr_in;
  12. rbuff, rbuff0, wbuff: string;
  13. bytes_recv: integer;
  14. wsdata: WSAData;
  15. pglen: integer;
  16.  
  17. const
  18. HOST = 'lannur.ru';
  19. PORT = 80;
  20.  
  21. begin
  22.  
  23. WSAStartup($0202, wsdata);
  24. sock := socket(AF_INET, SOCK_STREAM, 0);
  25. addr.sin_family := AF_INET;
  26. addr.sin_port := htons(PORT);
  27. addr.sin_addr.s_addr := inet_addr(PChar(HOST));
  28. if connect(sock, addr, sizeof(addr)) = 0 then
  29. writeln('Socket is opened...');
  30. wbuff := 'GET / HTTP/1.1'+#13#10+'Host: '+HOST+#13#10#13#10;
  31. send(sock, wbuff, Length(wbuff), 0);
  32. repeat
  33. listen(sock, 1);
  34. recv(sock, rbuff0, 3072, 0);
  35. rbuff := rbuff + rbuff0;
  36. until Pos('Content-Length: ', PChar(rbuff)) = 0;
  37. pglen := Length(
  38. Copy(rbuff, Pos('Content-Length: ', rbuff)+16, Pos(
  39. #13#10, Copy(rbuff, Pos('Content-Length: ', rbuff)+16,
  40. Length(rbuff)-Pos('Content-Length: ', rbuff)-16))-
  41. Pos('Content-Length: ', rbuff)-16)
  42. );
  43. repeat
  44. recv(sock, rbuff0, 3072, 0);
  45. rbuff := rbuff + rbuff0;
  46. until Pos(#13#10#13#10, rbuff) = 0;
  47. Delete(rbuff, 1, Pos(#13#10#13#10, rbuff)+3);
  48. repeat
  49. recv(sock, rbuff0, 3072, 0);
  50. rbuff := rbuff + rbuff0;
  51. until Length(rbuff) < pglen;
  52. closesocket(sock);
  53. writeln(rbuff);
  54. readln;
  55.  
  56. end.
  57.  


dimedrol.tab Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: dimedrol.tab (статус: Посетитель)
Вопрос отправлен: 2 ноября 2009, 00:14
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 4 ноября 2009, 22:48; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 2 ноября 2009, 00:38 [#1]:

listen не применяется для клиентских сокетом. И вызов его в середине кода точно не нужен. После вызова connect должны быть только чтение, запись и закрытие сокета.
Сам GET запрос сформирован правдоподобно.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2009, 08:30 [#2]:

Дополню.
Прогони под отладчиком, посмотри, чему равны переменные и содержимое буферов приёма.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
dimedrol.tab

dimedrol.tab (статус: Посетитель), 2 ноября 2009, 17:19 [#3]:

min@y™: Уже делал. В вопросе же написал, что от сервера ВООБЩЕ НИЧЕГО не приходит...
Вадим К: Я знаю насчет listen. Сначала пробовал без него. Написал уже от отчаяния, потому что без него тоже ничего не получалось ):
Вадим К

Вадим К (статус: Академик), 2 ноября 2009, 17:56 [#4]:

ну писать бессмысленный код в надежде, что он заработает - не стоит.
Галочка "подтверждения прочтения" - вселенское зло.
dimedrol.tab

dimedrol.tab (статус: Посетитель), 3 ноября 2009, 00:39 [#5]:

Согласен. А все же, что делать? Не может же быть, что эксперты не знают, как решить проблему? оО
Вадим К

Вадим К (статус: Академик), 3 ноября 2009, 00:45 [#6]:

я может быть и решил, вот только ноут второй с ремонта заберу, там винда с делфи осталась...
Если есть "свой" сервер, то можно попробовать к нему подключаться, а потом смотреть в логи сервера. Там часто можно и диагностировать ошибку. Можно попробовать просто установить денвер или даже просто сам апач.
Галочка "подтверждения прочтения" - вселенское зло.
dimedrol.tab

dimedrol.tab (статус: Посетитель), 4 ноября 2009, 00:39 [#7]:

Вадим К:
Когда заберешь ноут и решишь, прошу, скинь рабочий код на ящик dimedrol.tab@gmail.com. Только не забудь, а то я уже впал в отчаяние ))):
Вадим К

Вадим К (статус: Академик), 4 ноября 2009, 00:49 [#8]:

сразу говорю - на почту сбрасывать не буду. Вообще то, просить на форуме сбросить ответ на почту считается признаком невежества. Тем более, в ещё жаловаться на себя.
Галочка "подтверждения прочтения" - вселенское зло.
dimedrol.tab

dimedrol.tab (статус: Посетитель), 4 ноября 2009, 22:48 [#9]:

Вадим К:
Извиняюсь, не знал. Просто могу случайно потерять ссылку на свой вопрос и забыть номер, было уже такое пару раз.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:51
Выполнено за 0.03 сек.