Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Socket 
V
    Опции темы
RapMan
Дата 23.10.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



Доброе вреся суток
У меня проблема, работаю я как браузер, тоесть: сойденение, отправка данных, прием данных и закрытие сокета
Все норм работает, кроме получание данных... Я получаю не всю страницу (незнаю почему)
Код

uses WinSock, SysUtils;

const
  SizeOfData = 32767;

type
  TTCP = class
  private
    TCPSocket: TSocket;
    function HostToIP(Name: string; var Ip: string): Boolean;
  public
    function Connect(URL: String): Boolean;
    function Send(Data: PChar): Boolean;
    function Recive(Data: PChar=nil): PChar;
    procedure DisConnect;
  end;

implementation

function TTCP.HostToIP(Name: string; var Ip: string): Boolean;
var
  hostName: array [0..255] of char;
  hostEnt : PHostEnt;
  addr    : PChar;
begin
  try
    gethostname (hostName, sizeof (hostName));
    StrPCopy(hostName, Name);
    hostEnt := gethostbyname (hostName);
    if Assigned (hostEnt) then
      if Assigned (hostEnt^.h_addr_list) then begin
        addr := hostEnt^.h_addr_list^; 
        if Assigned (addr) then begin 
          IP := Format ('%d.%d.%d.%d', [byte (addr [0]), 
          byte (addr [1]), byte (addr [2]), byte (addr [3])]); 
          Result := True; 
        end 
        else 
          Result := False; 
      end 
      else 
        Result := False 
    else begin 
      Result := False; 
    end;
  except
    Result := False;
  end
end;

function TTCP.Connect(URL: String): Boolean;
var
  WSAData  : TWSAData;
  SockAddr : TSockAddr;
  IP       : String;
begin
  if WSAStartup($101, WSAData) <> 0 then
  begin
    Result := False;
    exit;
  end;

  TCPSocket := WinSock.Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  if TCPSocket = INVALID_SOCKET then
  begin
    Result := False;
    exit;
  end;

  if not HostToIP(URL, IP) then
  begin
    Result := False;
    exit;
  end;
  FillChar(SockAddr, SizeOf(TSockAddr), 0);
  SockAddr.sin_family       := AF_INET;
  SockAddr.sin_port         := htons(80);
  SockAddr.sin_addr.S_addr  := inet_addr(PChar(IP));

  if WinSock.Connect(TCPSocket, SockAddr, SizeOf(TSockAddr)) = SOCKET_ERROR then
  begin
    Result := False;
    exit;
  end;

  Result := True;
end;

function TTCP.Send(Data: PChar): Boolean;
begin
  if WinSock.Send(TCPSocket, Data[0], Length(Data), 0) = SOCKET_ERROR then
  begin
    Result := False;
    exit;
  end;
  Result := True;
end;

function TTCP.Recive(Data: PChar=nil): PChar;
var
  count: Integer;
begin
  Result := nil;
  if Data = nil then
  begin
    GetMem(Data, SizeOfData*SizeOf(Char));
    if Data = nil then
      exit;
  end;
  FillChar(Data^, SizeOfData, #0);
  count := WinSock.Recv(TCPSocket, Data^, SizeOfData, 0);
  if count < 0 then
  begin
    FreeMem(Data);
    exit;
  end;
  Result := Data;
end;

procedure TTCP.DisConnect;
begin
  CloseSocket(TCPSocket);
  WSACleanup;
end;

end.

в чем может быть ошибка?
Recive вызываю с Data=nill;
зарание спасибо!
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
MetalFan
Дата 23.10.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



всегда получаешь "не всю страницу"? какой хидер приходит?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
RapMan
Дата 23.10.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



ну сначала все гуд было - но по мере розвитии проекта, перестало работать
Хедер - часть страницы, сколько не посылал запрос - всегда часть страницы
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
SneG0K
Дата 23.10.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 2
Всего: 54



RapMan, а может остальная часть в браузере догружается скриптами или фреймами?
PM WWW Skype   Вверх
RapMan
Дата 23.10.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



нет, только что заметил, что первой запрос работает на ура, а уже второй - с провалом... почему?
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
RapMan
Дата 23.10.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



Сделал експеремент, перед посылкой запроса, я послал такой же запрос используя программу InetCrack и тогда все гуд - а иначе не доконца досланая страница
Вот почему такое?
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
MetalFan
Дата 23.10.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



в общем давай пример проекта и урлу, которая не полностью докачивается.
иначе получится гадание на кофейной гуще


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
RapMan
Дата 24.10.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



Проект дать не могу...
Я смотрел используя снифер - то он говорит что все даные приходят, тоесть страница вся загружаеться. Как ето такое может быть?
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
Qu1nt
Дата 24.10.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 2
Всего: 50



Может поможет = )
Код

program wiki;

{$APPTYPE CONSOLE}

uses
  WinSock, Windows;

const
  Host = 'ru.wikipedia.org';

var
  Sock : TSocket;
  Addr : TSockAddr;
  HostEnt : PHostEnt;
  WSAData : TWSAData;
  Source : string;
  Buf  : array [0..1023] of Char;
  Res  : Integer;
  Data : string = 'GET /wiki/HTTP HTTP/1.1' + #13#10 +
         'Host: ' + Host + #13#10 +
         'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)' + #13#10 +
         'Accept: text/html' + #13#10 +
         'Connection: close' + #13#10#13#10;

begin
  if WSAStartup($101, WSAData) <> 0 then
    Exit;
  WriteLn('Uses WinSock...');
  Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if Sock = INVALID_SOCKET then
  begin
    Writeln('Can not create socket. Code: ', WSAGetLastError());
    Exit;
  end;
  Writeln('Searching for: ', Host);
  HostEnt := gethostbyname(PChar(Host));
  if HostEnt = nil then
  begin
    Writeln('Unable to find host. Code: ', WSAGetLastError());
    Exit;
  end;
  with Addr do
  begin
    sin_family := AF_INET;
    sin_port   := htons(80);
    sin_addr   := PInAddr(HostEnt^.h_addr_list^)^;
  end;
  Writeln('Host found: ', inet_ntoa(Addr.sin_addr));
  if connect(Sock, Addr, SizeOf(TSockAddr)) = SOCKET_ERROR then
    if WSAGetLastError() <> WSAEWOULDBLOCK then
    begin
      Writeln('Unable to connect. Code: ', WSAGetLastError());
      Exit;
    end;
  Writeln('Connected.');
  Res := send(Sock, Data[1], Length(Data), 0);
  if Res = SOCKET_ERROR then
  begin
    Writeln('Uable to send data. Code: ', WSAGetLastError());
    Exit;
  end;
  repeat
    Res:= recv(Sock, Buf, 128, 0);
    if Res = SOCKET_ERROR then
    begin
      Writeln('Unable to receive data. Code: ', WSAGetLastError());
      Exit;
    end;
    if Res > 0 then
      Source := Source + Copy(Buf, 0, Res);
  until Res <= 0;
  WriteLn;
  WriteLn(Source);
  WriteLn;
  CloseSocket(Sock);
  Writeln('End.');
  WSACleanup;
  Readln;
end.

PM MAIL   Вверх
MetalFan
Дата 24.10.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата(RapMan @  24.10.2008,  13:30 Найти цитируемый пост)
Проект дать не могу...


Цитата(MetalFan @  23.10.2008,  21:23 Найти цитируемый пост)
давай пример проекта

не проект, а пример, на котором воспроизводится ошибка.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
RapMan
Дата 24.10.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



Все - ошибку нашел - recv делаю не в цикле  smile 
Все спасибо!
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.