|
Вопрос # 3 348/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Решил научиться пользоваться WINSOCK'ом в Delphi. Прошло около получаса попыток и гугления информации и чужих примеров, как я понял, что тут мне не справиться без помощи экспертов :\
В приложении к вопросу представлен мой код, который должен просто скачать по протоколу HTTP и вывести в консоль текст страницы, путь которой указан в константе HOST. Проблема заключается в том, что от сервера вообще ничего не приходит.
Прошу помочь и показать, где у меня ошибка. Заранее благодарю.
Приложение: Переключить в обычный режим- program htmlget;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils,
- WinSock;
-
- var
- sock: TSocket;
- addr: sockaddr_in;
- rbuff, rbuff0, wbuff: string;
- bytes_recv: integer;
- wsdata: WSAData;
- pglen: integer;
-
- const
- HOST = 'lannur.ru';
- PORT = 80;
-
- begin
-
- WSAStartup($0202, wsdata);
- sock := socket(AF_INET, SOCK_STREAM, 0);
- addr.sin_family := AF_INET;
- addr.sin_port := htons(PORT);
- addr.sin_addr.s_addr := inet_addr(PChar(HOST));
- if connect(sock, addr, sizeof(addr)) = 0 then
- writeln('Socket is opened...');
- wbuff := 'GET / HTTP/1.1'+#13#10+'Host: '+HOST+#13#10#13#10;
- send(sock, wbuff, Length(wbuff), 0);
- repeat
- listen(sock, 1);
- recv(sock, rbuff0, 3072, 0);
- rbuff := rbuff + rbuff0;
- until Pos('Content-Length: ', PChar(rbuff)) = 0;
- pglen := Length(
- Copy(rbuff, Pos('Content-Length: ', rbuff)+16, Pos(
- #13#10, Copy(rbuff, Pos('Content-Length: ', rbuff)+16,
- Length(rbuff)-Pos('Content-Length: ', rbuff)-16))-
- Pos('Content-Length: ', rbuff)-16)
- );
- repeat
- recv(sock, rbuff0, 3072, 0);
- rbuff := rbuff + rbuff0;
- until Pos(#13#10#13#10, rbuff) = 0;
- Delete(rbuff, 1, Pos(#13#10#13#10, rbuff)+3);
- repeat
- recv(sock, rbuff0, 3072, 0);
- rbuff := rbuff + rbuff0;
- until Length(rbuff) < pglen;
- closesocket(sock);
- writeln(rbuff);
- readln;
-
- end.
-
 |
Вопрос задал: dimedrol.tab (статус: Посетитель)
Вопрос отправлен: 2 ноября 2009, 00:14
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 4 ноября 2009, 22:48; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 2 ноября 2009, 00:38 [#1]:
listen не применяется для клиентских сокетом. И вызов его в середине кода точно не нужен. После вызова connect должны быть только чтение, запись и закрытие сокета.
Сам GET запрос сформирован правдоподобно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 2 ноября 2009, 08:30 [#2]:
Дополню.
Прогони под отладчиком, посмотри, чему равны переменные и содержимое буферов приёма.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
dimedrol.tab (статус: Посетитель), 2 ноября 2009, 17:19 [#3]:
min@y™: Уже делал. В вопросе же написал, что от сервера ВООБЩЕ НИЧЕГО не приходит...
Вадим К: Я знаю насчет listen. Сначала пробовал без него. Написал уже от отчаяния, потому что без него тоже ничего не получалось ):
|
|
Вадим К (статус: Академик), 2 ноября 2009, 17:56 [#4]:
ну писать бессмысленный код в надежде, что он заработает - не стоит.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
dimedrol.tab (статус: Посетитель), 3 ноября 2009, 00:39 [#5]:
Согласен. А все же, что делать? Не может же быть, что эксперты не знают, как решить проблему? оО
|
|
Вадим К (статус: Академик), 3 ноября 2009, 00:45 [#6]:
я может быть и решил, вот только ноут второй с ремонта заберу, там винда с делфи осталась...
Если есть "свой" сервер, то можно попробовать к нему подключаться, а потом смотреть в логи сервера. Там часто можно и диагностировать ошибку. Можно попробовать просто установить денвер или даже просто сам апач.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
dimedrol.tab (статус: Посетитель), 4 ноября 2009, 00:39 [#7]:
Вадим К:
Когда заберешь ноут и решишь, прошу, скинь рабочий код на ящик dimedrol.tab@gmail.com. Только не забудь, а то я уже впал в отчаяние ))):
|
|
Вадим К (статус: Академик), 4 ноября 2009, 00:49 [#8]:
сразу говорю - на почту сбрасывать не буду. Вообще то, просить на форуме сбросить ответ на почту считается признаком невежества. Тем более, в ещё жаловаться на себя.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
dimedrol.tab (статус: Посетитель), 4 ноября 2009, 22:48 [#9]:
Вадим К:
Извиняюсь, не знал. Просто могу случайно потерять ссылку на свой вопрос и забыть номер, было уже такое пару раз.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|