Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];

Вниз

Как забрать ответ сервера, если у него неопределён размер???   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.006 c
14-59849
Ihor Osov'yak
2003-05-01 00:45
2003.05.19
Backdoor.Death.26


1-59671
AndreyDm
2003-05-05 12:38
2003.05.19
Получение сообщений от консольного приложения


6-59824
[BAD]Angel
2003-03-20 18:26
2003.05.19
Как получить строку из Socker?


7-59963
Winni
2003-03-06 18:25
2003.05.19
как автозагрузить прогу не используя папку Автозагрузка?


1-59706
DDDeN
2003-05-07 05:56
2003.05.19
Вопросы по значкам Копирайт и т.д.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский