Конференция "Сети" » Проблемы с сокетами [D7, WinXP]
 
  • Slym © (14.01.08 09:36) [20]
    Григорьев Антон ©   (14.01.08 9:18) [19]
    Пример - он на то и пример: "Делай так и будет работать".
    А все что иначе не пример, а никчему не обязывающая демонстрация работы CTRL+V
    P.S. Дайте хоть ссылку на статью, а то хаю неведомо что :)
  • Григорьев Антон © (14.01.08 09:38) [21]

    > Slym ©   (14.01.08 09:36) [20]
    > P.S. Дайте хоть ссылку на статью, а то хаю неведомо что
    > :)

    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
  • Slym © (14.01.08 09:49) [22]
    Григорьев Антон ©   (14.01.08 9:18) [19]
    А проверки в таких примерах я опускал

    как в сексе: сначала научись предохраняться - пользоваться призервативом,
    а уж потом учи матчасть применения "девайса"
    Connect("Девушка")//нету проверки - девушка ли это?
    Write("Туды")// raise Exception.Create("Не туда..:)")
    Read("Сюды")// raise Exception.Create("Словили трепака")
    Close("Девушка")// raise Exception.Create("через 9 месяцев Out of memory, Произошло рождение ошибки молодости")



    Григорьев Антон ©   (14.01.08 9:18) [19]
    это не готовые примеры, а иллюстрации последовательности вызова сокетных функций для получения нужного результата

    тыды надо пЕсать что это псевдокод и компиляции не подлежит... (как приведено выше :) )
  • maxistent © (14.01.08 16:50) [23]
    Статья нормальная. Но желательно было бы в конце пару-тройку примеров приводить :-) Тада п ей ваще небыло п цены :-) Я по ней почти всё сделал. Вот только с "чтением" данных не могу разобрацо... Я сделал отдельный поток для 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;

  • Сергей М. © (14.01.08 17:17) [24]

    > maxistent ©   (14.01.08 16:50) [23]


    Ты бы к Кетмарю обратился - он знает куда тебе, твентинейджеру, податься.
  • maxistent © (14.01.08 17:20) [25]
    ???
  • Григорьев Антон © (14.01.08 17:29) [26]

    > maxistent ©   (14.01.08 16:50) [23]
    > Статья нормальная. Но желательно было бы в конце пару-тройку
    > примеров приводить :-)

    Примеры скоро будут, только немного в другом месте. Где-то в конце января - начале февраля должна выйти моя книга, в которую вошла и эта статья, в доработанном виде. Там к ней прилагается полностью рабочих 11 примеров, которые уже написаны без всяких упрощений, т.е. со всеми полагающимися проверками и обработками ошибок. Там есть и однонитевые, и многонитевые серверы.

    > ...Вот тут я незнаю что сделать...

    Что-то как-то я не понял, что именно вызывает затруднения. Что именно вы не знаете как сделать?
  • maxistent © (14.01.08 17:53) [27]
    Я "сохраняю" входящий поток данных в массив <Buffer:array of char>. Теперь мне нужно написать обработчик, который смог бы сделать что-то вроде

    ClientSocket1.Socket.ReceiveBuf();


    точнее, написать функцию ReceiveBuf для своей конкретной задачи:

    Function ReceiveBuf(var buf; BufSize:integer):integer;
    begin
    что здесь сделать,
    чтобы в <Buf> скопировать <BufSize> байт из <Buffer>?
    я не знаю, как преобразовать... :-(
    end;

  • maxistent © (14.01.08 17:55) [28]
    p.s. Как-то даже не удобно... я почти ушел от темы...
  • Slym © (15.01.08 04:14) [29]
    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); приведет к фрагментации памяти и дальнейшему краху сервера
  • maxistent © (15.01.08 06:17) [30]
    =-о  О как!.. ясно... пасиб за замечания.
 
Конференция "Сети" » Проблемы с сокетами [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]