-
Григорьев Антон © (14.01.08 9:18) [19] Пример - он на то и пример: "Делай так и будет работать". А все что иначе не пример, а никчему не обязывающая демонстрация работы CTRL+V P.S. Дайте хоть ссылку на статью, а то хаю неведомо что :)
-
-
Григорьев Антон © (14.01.08 9:18) [19] А проверки в таких примерах я опускал как в сексе: сначала научись предохраняться - пользоваться призервативом, а уж потом учи матчасть применения "девайса" Connect("Девушка") Write("Туды") Read("Сюды") Close("Девушка")
Григорьев Антон © (14.01.08 9:18) [19] это не готовые примеры, а иллюстрации последовательности вызова сокетных функций для получения нужного результататыды надо пЕсать что это псевдокод и компиляции не подлежит... (как приведено выше :) )
-
Статья нормальная. Но желательно было бы в конце пару-тройку примеров приводить :-) Тада п ей ваще небыло п цены :-) Я по ней почти всё сделал. Вот только с "чтением" данных не могу разобрацо... Я сделал отдельный поток для recv() и там же определяю: если result<=0, то коннект, наскока я понимаю, пропал (выполняю необходимые действия). Если же result>0, то я делаю сохраняю данные в массив. Вот примерно так это выглядит:
x:=recv(FClientSocket,buf,BufSize,0);
if x>0 then
begin inc(DataSize,x);
SetLength(MainBuffer,DataSize);
for i:=0 to x do
param.Buffer[param.DataSize-x+i]:=buf[i];
DoOnRead;
end
else
begin DoOnDisconnect;
break;
end;
DoOnRead;
begin
Buffer:array of char;
DataSize:integer;
Здесь нужно вызвать ещё одну процедуру обработки и передать в параметрах Buffer и DataSize.
end;
Procedure DoOnRead(var buf; BufSize:integer);
begin
if @OnClientRead<>nil then
begin
...Вот тут я незнаю что сделать...
??? OnClientRead(buf,BufSize); ???
end;
end;
-
> maxistent © (14.01.08 16:50) [23]
Ты бы к Кетмарю обратился - он знает куда тебе, твентинейджеру, податься.
-
???
-
> maxistent © (14.01.08 16:50) [23] > Статья нормальная. Но желательно было бы в конце пару-тройку > примеров приводить :-)
Примеры скоро будут, только немного в другом месте. Где-то в конце января - начале февраля должна выйти моя книга, в которую вошла и эта статья, в доработанном виде. Там к ней прилагается полностью рабочих 11 примеров, которые уже написаны без всяких упрощений, т.е. со всеми полагающимися проверками и обработками ошибок. Там есть и однонитевые, и многонитевые серверы.
> ...Вот тут я незнаю что сделать...
Что-то как-то я не понял, что именно вызывает затруднения. Что именно вы не знаете как сделать?
-
Я "сохраняю" входящий поток данных в массив <Buffer:array of char>. Теперь мне нужно написать обработчик, который смог бы сделать что-то вроде
ClientSocket1.Socket.ReceiveBuf();
точнее, написать функцию ReceiveBuf для своей конкретной задачи:
Function ReceiveBuf(var buf; BufSize:integer):integer;
begin
что здесь сделать,
чтобы в <Buf> скопировать <BufSize> байт из <Buffer>?
я не знаю, как преобразовать... :-(
end;
-
p.s. Как-то даже не удобно... я почти ушел от темы...
-
maxistent © (14.01.08 16:50) [23] for i:=0 to x do param.Buffer[param.DataSize-x+i]:=buf[i]; пипец... зачем данные накапливаешь? всеравно каждый раз DoOnRead вызываешь в котором скорее всего буфер чистишь maxistent © (14.01.08 16:50) [23] передать в параметрах Buffer и DataSize проблемы передать 2 параметра? если var buf; то передавать Buffer:array of char; нужно как Buffer[0]
и зачем весь этот гемор? твой самодельный сервер с кучей ошибок завалить будет проще пареной репы... for i:=0 to x do for i:=0 to x do // принято х, а копируем x+1 раз.... т.е. теоретически посылая по 1 байту ты огребешь по 2 причинам: 1. переполнение буфера на 1 байт 2. SetLength(MainBuffer,1); приведет к фрагментации памяти и дальнейшему краху сервера
-
=-о О как!.. ясно... пасиб за замечания.
|