![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как забрать ответ сервера, если у него неопределён размер??? [D7, WinME]
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-посылку префиксом размера, клиент считывает префикс размера и с этого момента знает, сколько "весит" идущий следом собственно "ответ"