Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как забрать ответ сервера, если у него неопределён размер??? [D7, WinME]


Страницы:   1 2

Duke DEE ©   (2003-03-17 16:54:00) 

NetLayerU.pas

function SocketBytesToRead(Socket: DWORD): DWORD;
var
Rd: u_long;
begin
if (ioctlsocket(Socket, $4004667F, Rd) = SOCKET_ERROR) then
begin
ShowMessage("error");
Result := DWORD(-1);
end
else
Result := Rd;
end;

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


Duke DEE   (2003-03-18 17:03:00) [21]

function ProxyRead(Req, Status: string): string;
var
SrvSock, IP: DWORD;
R, Len: Integer;
Host, S: string;
{$IFDEF PRIV}
F: Integer;
{$ENDIF}
begin
WasSocketError := True;
Result := "";
if (Req = "") then exit;
R := Pos(#10"Host: ", Req);
if (R <> 0) then
begin
Host := Copy(Req, R + 7, 255);
R := Pos(#10, Host);
if (R <> 0) then Delete(Host, R, 255);
end
else
Host := "localhost";
LogStr("ProxyRead: Host="" + Host + """);

SrvSock := SocketCreateWithTimeouts(60, 30 * 1000, 30 * 1000);
if (SrvSock = 0) then
begin
ShowStatus("[error 0] " + Status);
exit;
end;

ShowStatus("[connecting] " + Status);
IP := GetProxyIP(Host);
LogStr("ProxyRead: ProxyIP=[" + IPToStr(IP) + "]");
LogStr("ProxyRead: ProxyPort=[" + IntToStr(GetProxyPort) + "]");
LogStr("ProxyRead: connecting...");
if not SocketConnect(SrvSock, IP, GetProxyPort) then
begin
SocketClose(SrvSock);
ShowStatus("[error 1] " + Status);
exit;
end;

ShowStatus("[writing] " + Status);
if (SocketSend(SrvSock, Req[1], Length(Req)) <> 0) then
begin
SocketClose(SrvSock);
ShowStatus("[error 2] " + Status);
exit;
end;

ShowStatus("[reading: 0] " + Status);
repeat
R := SocketCanRead(SrvSock);
if (R < 0) then
begin
break;
end;

if (R = 0) then
Len := 1
else
begin
Len := SocketBytesToRead(SrvSock);
if (Len < 0) then
begin
break;
end;
if (Len = 0) then
begin
WasSocketError := False;
break;
end;
end;
if (Len > 0) then
begin
SetLength(S, Len);
R := SocketReceive(SrvSock, S[1], Len);
if (R = -1) then
begin
break;
end;
if (R = 0) then
begin
Result := Result + S;
ShowStatus("[reading: " + IntToStr(Length(Result)) + "] " + Status);
{$IFDEF PRIV}
if VerboseRead then
begin
F := 1;
while (F <= Length(S)) do
begin
if (S[F] = #10) then
begin
Insert(#13, S, F);
Inc(F);
end;
Inc(F);
end;
Write(Win2DOS(S));
end;
{$ENDIF}
end
else
ShowStatus("[waiting: " + IntToStr(Length(Result)) + "] " + Status);
end;
until False;
SocketClose(SrvSock);
ShowStatus("[ok] " + Status);

repeat
R := Pos(#13#10, Result);
if (R = 0) then exit;
Delete(Result, R, 1);
until False;
end;


Это???

Или ещё что ??


Digitman   (2003-03-18 16:57:00) [22]


> час-сервером Мастаков??? Адрес?


Мне оно надо ? Это ты ищи протокол и давай сюда его)

Да и искать-то не надо - он у тебя перед носом, в виде исходников Мастаковского чат-клиента


Duke DEE   (2003-03-18 16:37:00) [23]

час-сервером Мастаков??? Адрес?


Digitman   (2003-03-18 16:34:00) [24]

да какой тебе еще пример ? приводи протокол инф.обмена с час-сервером Мастаков - будут тебе и рекомендации более детальные


Duke DEE   (2003-03-18 16:30:00) [25]

Хм... Ничего не понимаю :(
Я имел в виду что, я скачиваю байт за байтом, из того что он мне присылает, а когда скачивать больше нечего, то отлючиться!!!
Может быть я что то недопонемаю, или дай какой нибудь пример, с TClientSocket, где можно скачивать файл с неопределённым размером...


Digitman   (2003-03-18 16:16:00) [26]


> разве WinsockAPI не стандартный компонент???


это вообще не компонент

это интерфейс программирования приложений с использованием соотв.спецификации


> Какие, и как, стандартные компоненты можно использовать???


Тот же пресловутый TClientSocket, например


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


я понятия не имею, что там и когда "кончится"... для этого нужно иметь перед носом и изучить протокол чата

но TCP есть TCP... а это - поточный протокол) ... а поток кончится только тогда, когда ты от сервера отключишься)


Duke DEE   (2003-03-18 16:02:00) [27]

Повторяю ответ:
То что было то и использовал!
Какие, и как, стандартные компоненты можно использовать???
И разве WinsockAPI не стандартный компонент???
А может быть можно скачивать без размера, то есть скачивать байт за байтом пока они есть, а как только закончиться прекратить функцию???


Digitman   (2003-03-18 08:29:00) [28]


> Ты видел Клиент для чата на этом сервере???


Работу Клиента видел. Не более того.

Повторяю вопрос :
Почему не используешь станд.компоненты ? почему - WinsockAPI ?


Duke DEE   (2003-03-17 17:58:00) [29]

Не уверен что понял твой вопрос! До этого с Сетями не сталкивался!


Duke DEE   (2003-03-17 17:56:00) [30]

Ты видел Клиент для чата на этом сервере??? (ТАКCHAT) Я скачал его и Исходники, Сидел и долго разберался как всё это работает! Вдруг пришла мысль переделать его под другой чат (chat.xakep.ru), и постепенно освоить принцип действия! Сделал вход в чат, узнал ID, сделал выход из чата, Даже Научился извлекать Onlinelist, то есть узнавать кто сейчас в чате!!! Хотел извлечь текст чата (фрейм со всеми сообщениями), но не тут то было!!! В чате на delphi.mastak.ru фрейм с сообщениями, определённого размера, и постепенно обновляется, на новый размер!!! А вот на chat.xakep.ru размер не указан, и байты дописываются к нему постепенно (не знаю как)!!! и моя программа чтобы скачать этот фрейм сначало пытается узнать его размер, но так как размера нет (а может быть он меняеться), она не может его скачать!!! Не знаю что даже и делать, ведь над программой сижу уже 2ую неделю!!! подскажи что нибудь, если что то не понятно объясню ещё раз!!!! Заранее спасибо, надеюсь теперь мой вопрос понятен!


Digitman   (2003-03-17 17:46:00) [31]

>Duke DEE

Тогда выкинь на время из головы разные там чаты, фреймы и пр.хрень и ответь для начала на вопрос:

Почему не используешь станд.компоненты ? почему - WinsockAPI ?


Duke DEE   (2003-03-17 17:39:00) [32]

to Digiman, если ты мне собираешся помочь то я тебе распишу мою проблему, Просто может у меня навыка не много, но разобраться я хочу, каждый когда то был ламером, (хотя ламером я себя не считаю!)


Digitman   (2003-03-17 17:30:00) [33]


> Фрейм с мессагами не обновляется


что есть "фрейм" ?
что есть "мессага" ?


> дописывается


кто и куда дописывается ?

ты вообще о чем ? о GUI или таки - о Winsock и TCP-протоколе ?


Ketmar   (2003-03-17 17:20:00) [34]

>Duke DEE © (17.03.03 16:54)
ты никак не можешь этого узнать. пока соединение не закрыто, всегда может прийти еще байтик. и даже не один.
Satanas Nobiscum! 17-Mar-XXXVIII A.S.


Duke DEE   (2003-03-17 17:10:00) [35]

Не работает, или я тупой! Просто я делаю Клиент для чата, и Фрейм с мессагами не обновляется, а дописывается, и даже в его свойствах не "стоит" ни размера ни даты создания, в отличие от других Чатов где фрейм с мессагами, постепенно обновляется!!! И мне надо что бы моя прога "слизывала" весь фрейм, а потом дописывала туда дополнительные мессаги!!! Но с этим Кодом это не получается!!!


Digitman   (2003-03-17 17:00:00) [36]

клиент должен знать свой сервер "в лицо")

сервер предваряет любую свою TCP-посылку префиксом размера, клиент считывает префикс размера и с этого момента знает, сколько "весит" идущий следом собственно "ответ"


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо