Текущий архив: 2003.05.19;
Скачать: CL | DM;
ВнизКак забрать ответ сервера, если у него неопределён размер??? Найти похожие ветки
← →
Duke DEE (2003-03-17 16:54) [0]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;
Пытается узнать сколько весит ответ сервера, а ответ не закончен, то есть он постоянно дополняется!! И у него нет определённого размера!!! Может я тупой не умею вопросы писать, но проблема не исчезает!
← →
Digitman (2003-03-17 17:00) [1]клиент должен знать свой сервер "в лицо")
сервер предваряет любую свою TCP-посылку префиксом размера, клиент считывает префикс размера и с этого момента знает, сколько "весит" идущий следом собственно "ответ"
← →
Duke DEE (2003-03-17 17:10) [2]Не работает, или я тупой! Просто я делаю Клиент для чата, и Фрейм с мессагами не обновляется, а дописывается, и даже в его свойствах не "стоит" ни размера ни даты создания, в отличие от других Чатов где фрейм с мессагами, постепенно обновляется!!! И мне надо что бы моя прога "слизывала" весь фрейм, а потом дописывала туда дополнительные мессаги!!! Но с этим Кодом это не получается!!!
← →
Ketmar (2003-03-17 17:20) [3]>Duke DEE © (17.03.03 16:54)
ты никак не можешь этого узнать. пока соединение не закрыто, всегда может прийти еще байтик. и даже не один.
Satanas Nobiscum! 17-Mar-XXXVIII A.S.
← →
Digitman (2003-03-17 17:30) [4]
> Фрейм с мессагами не обновляется
что есть "фрейм" ?
что есть "мессага" ?
> дописывается
кто и куда дописывается ?
ты вообще о чем ? о GUI или таки - о Winsock и TCP-протоколе ?
← →
Duke DEE (2003-03-17 17:39) [5]to Digiman, если ты мне собираешся помочь то я тебе распишу мою проблему, Просто может у меня навыка не много, но разобраться я хочу, каждый когда то был ламером, (хотя ламером я себя не считаю!)
← →
Digitman (2003-03-17 17:46) [6]>Duke DEE
Тогда выкинь на время из головы разные там чаты, фреймы и пр.хрень и ответь для начала на вопрос:
Почему не используешь станд.компоненты ? почему - WinsockAPI ?
← →
Duke DEE (2003-03-17 17:56) [7]Ты видел Клиент для чата на этом сервере??? (ТАКCHAT) Я скачал его и Исходники, Сидел и долго разберался как всё это работает! Вдруг пришла мысль переделать его под другой чат (chat.xakep.ru), и постепенно освоить принцип действия! Сделал вход в чат, узнал ID, сделал выход из чата, Даже Научился извлекать Onlinelist, то есть узнавать кто сейчас в чате!!! Хотел извлечь текст чата (фрейм со всеми сообщениями), но не тут то было!!! В чате на delphi.mastak.ru фрейм с сообщениями, определённого размера, и постепенно обновляется, на новый размер!!! А вот на chat.xakep.ru размер не указан, и байты дописываются к нему постепенно (не знаю как)!!! и моя программа чтобы скачать этот фрейм сначало пытается узнать его размер, но так как размера нет (а может быть он меняеться), она не может его скачать!!! Не знаю что даже и делать, ведь над программой сижу уже 2ую неделю!!! подскажи что нибудь, если что то не понятно объясню ещё раз!!!! Заранее спасибо, надеюсь теперь мой вопрос понятен!
← →
Duke DEE (2003-03-17 17:58) [8]Не уверен что понял твой вопрос! До этого с Сетями не сталкивался!
← →
Digitman (2003-03-18 08:29) [9]
> Ты видел Клиент для чата на этом сервере???
Работу Клиента видел. Не более того.
Повторяю вопрос :
Почему не используешь станд.компоненты ? почему - WinsockAPI ?
← →
Duke DEE (2003-03-18 16:02) [10]Повторяю ответ:
То что было то и использовал!
Какие, и как, стандартные компоненты можно использовать???
И разве WinsockAPI не стандартный компонент???
А может быть можно скачивать без размера, то есть скачивать байт за байтом пока они есть, а как только закончиться прекратить функцию???
← →
Digitman (2003-03-18 16:16) [11]
> разве WinsockAPI не стандартный компонент???
это вообще не компонент
это интерфейс программирования приложений с использованием соотв.спецификации
> Какие, и как, стандартные компоненты можно использовать???
Тот же пресловутый TClientSocket, например
> А может быть можно скачивать без размера, то есть скачивать
> байт за байтом пока они есть, а как только закончиться прекратить
> функцию???
я понятия не имею, что там и когда "кончится"... для этого нужно иметь перед носом и изучить протокол чата
но TCP есть TCP... а это - поточный протокол) ... а поток кончится только тогда, когда ты от сервера отключишься)
← →
Duke DEE (2003-03-18 16:30) [12]Хм... Ничего не понимаю :(
Я имел в виду что, я скачиваю байт за байтом, из того что он мне присылает, а когда скачивать больше нечего, то отлючиться!!!
Может быть я что то недопонемаю, или дай какой нибудь пример, с TClientSocket, где можно скачивать файл с неопределённым размером...
← →
Digitman (2003-03-18 16:34) [13]да какой тебе еще пример ? приводи протокол инф.обмена с час-сервером Мастаков - будут тебе и рекомендации более детальные
← →
Duke DEE (2003-03-18 16:37) [14]час-сервером Мастаков??? Адрес?
← →
Digitman (2003-03-18 16:57) [15]
> час-сервером Мастаков??? Адрес?
Мне оно надо ? Это ты ищи протокол и давай сюда его)
Да и искать-то не надо - он у тебя перед носом, в виде исходников Мастаковского чат-клиента
← →
Duke DEE (2003-03-18 17:03) [16]
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 17:16) [17]ну ? и что ? достаточно работоспособный код !
но здесь нет ничего напоминающего протокол инф.обмена - только транспорт
← →
Duke DEE (2003-03-18 17:33) [18]Да работоспособный! Все файлы скачивает!, а когда появляется тот файл без размера то на
Len := SocketBytesToRead(SrvSock);
Программа замирает!!!
function SocketBytesToRead(Socket: DWORD): DWORD;
var
Rd: u_long;
begin
if (ioctlsocket(Socket, $4004667F, Rd) = SOCKET_ERROR) then
begin
Result := DWORD(-1);
end
else
Result := Rd;
end;
И что делает эта функция:
function SocketReceive(Socket: DWORD; var Data; DataSize: DWORD): Integer;
var
P: PChar;
Rv: DWORD;
begin
P := @Data;
while (DataSize > 0) do
begin
Rv := WinSock.recv(Socket, P^, DataSize, 0);
if (Rv = DWORD(SOCKET_ERROR)) then
begin
Result := WSAGetLastError;
if (Result = 0) then Result := -1;
exit;
end;
if (Rv = 0) then begin Result := -100; exit; end;
Inc(P, Rv);
Dec(DataSize, Rv);
end;
Result := 0;
end;
Что именно протокол инф.обмен, где он может быть?? (NetLayerU.pas)??
← →
Digitman (2003-03-18 17:38) [19]а о каком "файле" может вообще идти речь в чате ? просвети меня, тундру)
← →
Duke DEE (2003-03-18 17:40) [20]хм... тебе нравиться надо мной издеваться =)) Ок не файл а поток,ответ сервера, или как его завут, я же не такой просвещённый как ты!!!
Заранее благодарен!
← →
Digitman (2003-03-18 17:48) [21]SocketBytesToRead() актуальный размер данных, доступный в буфере приема гнезда на момент вызова
SocketReceive() собственно делает выборку из буфера приема заданного гнезда в указанный буфер указанного размера
← →
Digitman (2003-03-18 17:53) [22]
> Duke DEE
ничто не мешает тебе, имея этот код, изучить его в работе под отладчиком ! и понять. что где, как и почему делается
в помощь тебе - http://book.itep.ru, а так же - Winsok2 Programmer"s Reference Help от Борланда в составе Delphi
← →
Duke DEE (2003-03-18 17:54) [23]SocketReceive() что делает я не особо понял (где это буфер указанного размера), а как работает???
← →
Digitman (2003-03-18 17:59) [24]function SocketReceive(Socket: DWORD; var Data; DataSize: DWORD): Integer;
Socket - хэндл гнезда
Data - ссылка на буфер, выделенный в контексте вызывающего кода
DataSize - размер данных, требуемый к пересылке из буфера приема гнезда в буфер Data
← →
Duke DEE (2003-03-18 18:02) [25]Уже лучше, попробую чё нить понять, прийду позже!! Может можно Этот SocketReceive Изменить, чтобы он без Datasize обходился, и скачивал то что есть???
← →
Digitman (2003-03-18 18:06) [26]читай про протокол TCP !!!!
← →
Duke DEE (2003-03-18 18:11) [27]ОК, буду читать, но, Microsoft Inet Explorer, каким то образом забирает этот поток!! В отличие от Оперы, которая начинает глючить!
← →
gsu (2003-03-18 18:39) [28]хм ...
← →
Digitman (2003-03-19 08:22) [29]ты понимаешь разницу между вызываемой и вызывающей процедурой-функцией ?
что ты уперся в эту Socketreceive()-то ? Это - вызываемая ф-ция, ей какие факт.параметры передадут - с теми она и работает ! Смотри внимательно в код вызывающей ф-ции : какие параметры и при каких условиях она формирует для передачи в кач-ве фактических в ф-цию Socketreceive() !
← →
Duke DEE (2003-03-19 10:36) [30]Если не трудно зайди на http://chat.xakep.ru/login?chat=xakep и посмотри как сделан фрейм с сообщениями, причём эксплорер постоянно докачивает этот фрейм, и у фрейма нет размера и даты создания!!!
Мне очень интересно всё это разбирать, но я не хочу сидеть в форуме 2 недели, а потом узнать что это сделать невозможно!! =))
Как то надо создать две функции, 1 для всех ответов, а вторая специально для этого с сообщениями чата, и 2ой будет всегда открыт на приём сообщений!
У меня такая идея!
Послушай чем отличается GET от POST, и вообще что они делают?? В смысле я могу поставить GET, и всё будет работать, и POST, всё будет также, вроде в Ява Скрипт тоже разницу я не нашёл!
Большое спасиба!
← →
Digitman (2003-03-19 10:55) [31]
> Мне очень интересно всё это разбирать
А мне совершенно не интересно ! Все эти гипертектовые чаты - одно и то же и по транспорту и по механике, все различия, в осн., сводятся к тем или иным "наворотам" интерфейса взаимодействия с пользователем.
> я не хочу сидеть в форуме 2 недели, а потом узнать что это
> сделать невозможно!!
Зачем сидеть ? У тебя есть готовый работающий исх-к одного из чат-клиентов, отрассируй его в режиме встроенной отладки и поймешь, как работают все эти чаты ! Другой вопрос, что в дан.случае работа клиента по HTTP реализована, видимо, "своими силами", в то время как те же GET/POST делают то же самое автоматически
← →
Duke DEE (2003-03-19 17:35) [32]Если ты програмизмом занимаешься, то ты программистом и работаешь!! За сколько денег ты бы написал простенький клиент для ХАКЕР чата, с исходником???
← →
Digitman (2003-03-20 08:19) [33]$5000 .. Устраивает ?))
← →
Duke DEE (2003-03-20 13:45) [34]за 50Е может быть и купил бы, но не 5000Е !! Ты кем работаешь??? И где??
← →
Digitman (2003-03-20 14:46) [35]
> Duke DEE
Я-то ? да дворники мы) .. в жилкомхозе)
А где это ты видел , чтобы дворники за 50 каких-то там Е наперегонки бросались делать клиентские программы индивид.использования за 50Е ? 50 этих самых "Е" программа, возможно, будет стоить только в том случае, если она будет распространяться по нашенской, "дворницкой" лицензии, предусмотренной в контракте с тобой, в коем ты обязуешься продать самостоятельно остальные N - 1 экземпляров, где N = $5000 / 50"Е"))))
← →
Duke DEE (2003-03-21 01:15) [36]Туй с тобой, =)) Помоги с другим, У меня немецкий виндовс и англизкая Дельфи, извеняюсь что не по сетям!
1: как мне в Дельфи редакторе настроить Русские Шрифты (они у меня есть), всё перепробывал но не работает!
2: как мне в программу вставить полную поддержку русского, независимо от "Языка" виндовс?? Чтобы у меня все Лэйблы были на русском и тд, и когда я к примеру в Эдит текст русский вставляю, он бы был русским, а не вопросами!
Заранее спасибо!!!
Ещё раз извеняюсь что не в тему!
Страницы: 1 вся ветка
Текущий архив: 2003.05.19;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.007 c