Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизRecord и String: Жить им вместе? Найти похожие ветки
← →
kirik (2006-09-13 10:26) [0]Как можно данные из TRecord запихнуть потоком в String? То есть например при получении через сокет пакета данных проверять если есть определённая датаграмма - то в Trecord, иначе - в String?
← →
Dmitrij_K (2006-09-13 10:29) [1]Имеем буфер
buf : Array[0..255] of Byte;
if String then
begin
SetLength(str,РАЗМЕР);
CopyMemory(@str[1],@buf[0],РАЗМЕР);
end
else
begin
CopyMemory(@Record,@buf[0],SizeOf(Record));
end;
← →
Сергей М. © (2006-09-13 10:29) [2]var
Record: TRecord;
Str: String;
..
SetLength(Str, SizeOf(Record));
Move(Record, PChar(Str)^, SizeOf(Record));
← →
kirik (2006-09-13 10:35) [3]простое перемещение в памяти?
← →
Сергей М. © (2006-09-13 10:38) [4]простое "запихивание")
← →
kirik (2006-09-13 10:40) [5]> ests> mys.htm
Datagram received: Сорский ГОК,ОАО
Datagram received: Сорский ГОК,ОАО
вот что получаем после "запихивания". первая строчка это два отдельных сообщения !текстовых! отправленных не как файл, а как простой текст. он не переносит строки..
← →
kirik (2006-09-13 10:46) [6]> tetetetetet~?УwЁЮ> test> test> test> Edit2
во чё даёт гад:(
← →
Dmitrij_K (2006-09-13 10:50) [7]ты код показывай а не результат. Телепаты в отпуске
← →
kirik (2006-09-13 10:58) [8]procedure TForm1.Button5Click(Sender: TObject);
var St: TFileStream; ms: TOrganization; I: Integer;
begin
if (ClientSocket1.Active=False) then Exit;
try
St := TFileStream.Create("\\192.168.0.1\shared\áàçà\db2\dblist.dat ", fmOpenRead or fmShareDenyNone);
with ClientSocket1 do begin
for I := 1 to 1 do begin
Randomize;
st.Seek(sizeof(ms)*Random(555), 0);
st.Read(ms, sizeof(ms));
socket.SendBuf(ms, sizeof(ms));
end;
end;
St.Destroy;
except
end;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var mr: string; rl: integer; oa: torganization;
begin
{Îò êëèåíòà ïîëó÷åíî ñîîáùåíèå - âûâîäèì åãî â Memo1}
rl := socket.ReceiveLength;
socket.ReceiveBuf(oa, socket.ReceiveLength);
if (rl=sizeof(oa)) then begin
Memo1.Lines.Insert(0, "Datagram received: "+trim(oa.Name));
end else begin
SetLength(mr, SizeOf(oa)+2);
Move(oa, PChar(mr)^, SizeOf(oa));
mr := trim(mr) + #13#10;
Memo1.Lines.Insert(0,"> "+mr);
end;
if (mr=#13#10) then Socket.Close;
end;
← →
Elen © (2006-09-13 11:04) [9]
> kirik
А ты не забыл что в String первые 2 байта - длина строки?
Это я по поводуMove(oa, PChar(mr)^, SizeOf(oa));
Ты уж лучше обьявиmr:pchar
и не забывай добавлять при переносе #0
← →
kirik (2006-09-13 11:05) [10]а при выводе сделать StrPas? если можно, код? Не соображаю - ночью не спал.
← →
Сергей М. © (2006-09-13 11:06) [11]Ерунда какая-то .. код - фтопку ..
Ты скажи по-русски, тебе что нужно сделать-то - передать файл от клиента серверу или что ?
ПРиведи фрагмент реального содержимого файла dblist.dat ..
← →
kirik (2006-09-13 11:09) [12]Фрагмент файла:
Элпроммаш, ООО 443090 Самара 846 2763000,Блинов Е.В. 2734999,2734900 0.edf090.edf Промышленное оборудование Самарская область Салаватский железобетонный завод, ОАО www.elprommash.ru mail@elprommash.ru
Причина:
Не устраивает скорость передачи данных из этого файла - для удалённых пользователей слишком долго
Попытки действия
1. Кеширование в архив на локал. Отвергнуто, т.к. изменения не фиксировались вовремя.
2. В данный момент попытка транзакций через сокеты, дабы передавать данные пакетами по SizeOF(TOrganization)[955 байт], а не весь файл каждый раз. При попытке быстро передать несколько записей-Async error.
Вот...
← →
Сергей М. © (2006-09-13 11:14) [13]
> kirik (13.09.06 11:09) [12]
Т.е. файл - текстовый ?
> При попытке быстро передать несколько записей-Async error
Абсолютно нормальное явление.
← →
kirik (2006-09-13 11:15) [14]То есть файл - file of TOrganization [655x955bytes]
← →
kirik (2006-09-13 11:18) [15]>> При попытке быстро передать несколько записей-Async error
Хм. А как бороться? Группировать по N записей и слать скопом?
← →
Сергей М. © (2006-09-13 11:24) [16]
> То есть файл - file of TOrganization [655x955bytes]
>
Приведи объявление структуры TOrganization
> как бороться?
Либо на клиенте использовать режим ctBlocking, либо грамотно обрабатывать событие OnWrite, либо использовать SendStream
С сервером - отдельная песня. Он у тебя заведомо неправильно организован на приеме.
← →
kirik (2006-09-13 11:30) [17]А это не моя организация, стянул с delphi.mastak.ru, пожалуйста, помогите, как правильно организовать? сроки поджимают...
TOrganization=record
Name : String[100];
AdressIndex : String[8];
AdressCity : String[50];
AdressStreet : String[100];
AdressDom : String[4];
AdressOffice : String[4];
OfficePhoneC : String[6];
OfficePhoneN : String[8];
RukovodName : String[80];
RukovodPhoneC : String[6];
RukovodPhoneN : String[8];
RukovodPhoneE : String[4];
ExtPhones : String[110];
Vajnost : (vlLow, vlMedium, vlHigh, vlNone);
VajnostFlag : (vfRed, vfGreen, vfBlue, vfNone);
Prozvon : (psProzvoneno, psNeprozvoneno, psPM);
Vozrast : (tsOld, tsNew);
Obrabotka : (osObrabotano, osNeobrabotano);
Prodagi : (pcLow, pcMedium, pcHigh, pcNone);
SpecFlag : (sfRed, sfGreen, sfBlue, sfNone);
ExtInfoFile : String[20]; // ext-info filename
Category : String[80];
Region : String[80];
IsInHolding : Boolean;
HoldingName : String[100];
WWW : String[80];
Email : String[80];
end;
← →
kirik (2006-09-13 11:40) [18]> Либо на клиенте использовать режим ctBlocking
точно такая же ошибка, да ещё и текст принимать перестал
> грамотно обрабатывать событие OnWrite
брат, я чайник в сокетах!
> либо использовать SendStream
а как потом из него строчку вытаскивать, через StringStream?
← →
Dmitrij_K (2006-09-13 11:56) [19]На принимающей стороне заведи глобальный буфер, в него читай из сокета данные, пока его размер не станет >= твоей структуре. Потом из буфера скопируй данные в свой рекорд и удали скопированные данные из временного буфера.
← →
Сергей М. © (2006-09-13 12:12) [20]Клиент:
var
rec: TOrganization;
ms: TStream;
..
ms := TMemoryStream.Create;
try
ms.WriteBuffer(rec, SizeOf(rec));
ms.Position := 0;
ClientSocket.Socket.SendStream(ms);
except
ms.Free;
raise;
end;
Сервер:
type
PRecvData = ^TRecvData;
TRecvData = packed record
BytesRead: Integer;
org: TOrganization;
end;
событие OnConnect:
Socket.Data := AllocMem(SizeOf(TRecvData));
событие OnDisConnect:
SysFreeMem(Socket.Data);
событие OnRead:
var
pBuf: ^TOrganization;
cBytesToRead: Integer;
cBytesRead: Integer;
..
pBuf := PRecvData(Socket.Data).org;
cBytesRead := PRecvData(Socket.Data).BytesRead;
Inc(PByte(pBuf), cBytesRead);
cBytesToRead := SizeOf(pBuf^) - cBytesRead;
cBytesRead := Socket.ReceiveBuf(pBuf^, cBytesToRead);
if cBytesRead = 0 then Exit;
Dec(cBytesToRead, cBytesRead);
cBytesRead := (SizeOf(pBuf^) - cBytesToRead) mod SizeOf(pBuf^));
PRecvData(Socket.Data).BytesRead := cBytesRead;
if cBytesRead = 0 then ShowMessage("Принята очерадная структура TOrganization"); //данные которой доступны в ЭТОТ момент в PRecvData(Socket.Data).org
← →
kirik (2006-09-13 12:35) [21]побайтовое чтение?
← →
Сергей М. © (2006-09-13 12:37) [22]
> побайтовое чтение?
Какое такое "побайтовое" ?!
Где ты его увидел ?
← →
kirik (2006-09-13 12:52) [23]ой. звиняюсь. не туда посмотрел:)
может я конечно глупость спрошу... но всё же:
требуется реализация такая:
1. ф-ция SendData(Pos: Integer; Data: TOrganization): Boolean;
возвращает да если была запись нет если не получилось
2. ф-ция RecvData(Pos: Integer): TOrganization;
возвращает прочитанную с запроса на сервере позицию
+ ещё желательно универсальную функцию для чтения любых файлов по указанному количеству байт вроде:
procedure ReadFrom(var Buffer; DataSize, Pos: word);
function WriteTo(const Buffer; DataSize, Pos: word);
у меня они реализованы под файловую систему, а как их запустить в алгоритм чтения из сокетов? в принципе соединение клиента устанавливается при входе, и разрывается только при закрытии программы СУБД..
Как бы это...ну в смысле воспроизвести? Бьюсь неделю - не пойму... Там данные передаются довольно интенсивно (3-4 запроса в секунду), и надо ещё это учесть...ох, голова болит уже...
Тыкните меня носом в ту кучу, где нужно копать...
← →
Elen © (2006-09-13 12:55) [24]
> ещё желательно универсальную функцию для чтения любых файлов
> по указанному количеству байт
BlockRead, BlockWrite
← →
Elen © (2006-09-13 13:01) [25]
> kirik
кстати что твои пользователи настолько удалены что обычное чтение тормозит? или они не в локалке?
← →
kirik (2006-09-13 13:09) [26]вторая часть офиса работает через VPN, а у нас канал узковат...
BR, BW я это знаю, только это у меня реализовано для файловой системы а не для сети! Тут дело в том что я не пойму как распознать качество полученных данных...
← →
Elen © (2006-09-13 13:13) [27]
> kirik
А базами данных работать не хош?
← →
kirik (2006-09-13 13:18) [28]плин... не умею я:( ...да и нет необходимости из-за 600 записей учиться...
← →
Сергей М. © (2006-09-13 13:22) [29]
> kirik (13.09.06 12:52) [23]
Принципиально ли использование именно TServer/ClientSocket ?
← →
kirik (2006-09-13 13:25) [30]Принципиально упорность в быстродействии - как минимум 5 мб/сек. Есть другие предложения? Indy?
← →
Сергей М. © (2006-09-13 13:27) [31]
> kirik (13.09.06 13:25) [30]
При твоей подготовке - да, Indy.
← →
Сергей М. © (2006-09-13 13:29) [32]Или ICS.
Или, в кр.случае, TTCPServer/Client.
TServer/ClientSocket для тебя в дан.случае (даже в блок.режиме) вряд ли подойдет.
← →
Elen © (2006-09-13 13:30) [33]
> kirik
Не хочеш учиться А здря... БД на пустом месте не создавались. И твою проблему решилибы на раз-два
← →
kirik (2006-09-13 13:34) [34]Сергей М. C Indy пытался разобраться но никак не могу понять. Технологию пытался сделать так:
192.168.1.175 > CONNECT 192.168.1.10
+CONNECT OK
192.168.1.175 > GET dblist.dat [номер записи] [размер данных]
+REQUEST ACCEPTED
sdlkgfsdkjfghkjdflhgjksdfhgjklserdgkndfgjldksfgberltgjebsdrfg <-- данные
+OK
+CONNECTION CLOSED
192.168.1.175 > CONNECT 192.168.1.10
+CONNECT OK
192.168.1.175 > POST dblist.dat [номер записи] [размер данных]
+REQUEST ACCEPTED
dfhgjkdfhgjkhdskjghlsfdhgksdhfgjklshdfgjkhdsfghsdfjkgjdffgf <-- данные
+OK
+CONNECTION CLOSED
Что нужно для реализации?
← →
kirik (2006-09-13 13:35) [35]Elen некогда тут учиться, 3 дня до сдачи проекта
← →
Сергей М. © (2006-09-13 13:39) [36]
> kirik (13.09.06 13:34) [34]
> Технологию пытался сделать так:
Это хрень какая-то, а не "технология")
> некогда тут учиться, 3 дня до сдачи проекта
Прими мои соболезнования по поводу твоего скоропостижного увольнения.
Сети - это не два пальца об асфальт)
← →
kirik (2006-09-13 13:41) [37]Сергей М.
Я думал, что здесь издеваться не будут. Оказалось, ошибся...
← →
Elen © (2006-09-13 13:44) [38]
> kirik
Это ты сам над собой издеваешся решая такие задачи таким способом, еще и не зная как этот способ применять. Заранее думай впредь. А пока так и оставь с тормозом до следующего апгрейда.
← →
Сергей М. © (2006-09-13 13:45) [39]
> kirik (13.09.06 13:41) [37]
Здесь и не издеваются.
Здесь тебе намекают, что приведенное тобой в [34] - черт-те откуда взятая галиматья.
Здесь тебе намекают, что ежели ты "пытал" Инди, то в твоих же интересах привести код, а не ту самую лог-галиматью
← →
kirik (2006-09-13 13:46) [40]Хотел реализовать наподобие POP3 сервера...
← →
kirk (2006-09-13 13:46) [41]> до следующего апгрейда.
какого?
← →
Elen © (2006-09-13 13:52) [42]
> kirk
Ну ты зачем и кому эту прогу делаеш? Что обновлять версии со временем не хочеш?
← →
kirik (2006-09-13 13:55) [43]Elen хочу конечно.. и формат данных меняться будет... но сейчас это на первом плане...
← →
Сергей М. © (2006-09-13 13:56) [44]
> kirik (13.09.06 13:46) [40]
>
> Хотел реализовать наподобие POP3 сервера...
К POP3-серверу изложенное тобой не имеет ни малейшего отношения
А если бы и имело, то почему ты не использовал готовые компоненты, реализующие этот протокол ?
← →
kirik (2006-09-13 13:58) [45]Ну сам принцип.. запрос-ответ.. и всё такое.. а не использовал потому что не умею, только и всего... вот пытаюсь научиться тут у вас.
← →
Elen © (2006-09-13 13:59) [46]
> kirik
Вот и подумай на будущее о базах данных. А сейчас оставь как есть раз твой проект будет менятся радикально в корне то нет смысла его колбасить до суперского
← →
kirik (2006-09-13 14:00) [47]Сергей М.
вот здесь:выдаёт несовместимость типов...
var
pBuf: ^TOrganization;
cBytesToRead: Integer;
cBytesRead: Integer;
begin
pBuf := PRecvData(Socket.Data).org;
← →
kirik (2006-09-13 14:04) [48]Elen © (13.09.06 13:59) [46]
хочется чтобы лучше было... совершенствоваться...
← →
Сергей М. © (2006-09-13 14:05) [49]pBuf := @PRecvData(Socket.Data).org
p.s.
Без знания Паскаля как такового делать тебе в сетях нечего.
← →
kirik (2006-09-13 14:06) [50]Сергей М. я с бейсика сразу на delphi пересел... ничего уж не поделаешь
← →
Сергей М. © (2006-09-13 14:09) [51]
> kirik (13.09.06 14:06) [50]
А я с машкода и ассемблера.
Мне повеситься ?)
← →
Barloggg (2006-09-14 09:01) [52]а почему бы тебе не создать свой собственный формат данных?
не протокол ясно дело?
данные передаются потоком?
ну так насуй туда управляющих символов.
скажем приходит тебе блок. известной длины.
ты читаешь первый байт. это просто идентификатор тех данных которые идут следом. скажем этот байт тебе гласит что дальше идет строка.
строки разные бывают.
предположим что у тебя перед строкой идет ее размер. какой размер 4 байта, потом текст строки.
сначал читаешь эти 4 байта в integer, потом считываешь по этому числу символы в строку.
строка считана.
читаешь следующий байт.
это идентификатор следующего подблока.
короче банальная поточная структура данных.
вот так и читаешь блок за блоком. ручками.
как записать?
тоже ручками. в соответствии с твоей структурой сначала составляешь блок: т.е. пишешь идентификатор, потом информацию, потом снова идентификатор, потом опять информацию.
но пишешь это все сначала во временный массив или в строку, в общем у себя пишешь.
и после окончяания оформления блока посылаешь его по протоколу единым махом.
и тормоза исчезнут.
это кстати ответ на самый первый вопрос.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.015 c