• santey (25.09.08 12:52) [0]
    Уважаемые помогите мне с таким вопросом.
    Сеть на низком уровне.
    отправляю данные некого ms:tmemorystream:
    var
    p:pchar;
    l:integer;
    begin
    l:=ms.size;
    getmem(p,l+1);
    ms.read(p^,l);
    send(l,sizeof(l),0);
    i:=send(server,p^,l,0);
    end;


    На приемной стороне

    var
    p:pchar;
    l:integer;
    begin
    recv(client,l,sizeof(l),0);
    getmem(p,l+1);
    i:=recv(client,p^,l,0);

    И на приемной и на передающей стороне ошибок нет. И приемная и передающая сторона отправляет.принимает равное количество байт. Но при сравнении двух буферов который отправлен p^ и принятый p^ выявлябтся несоответствия. К примеру при посылке 1030454 байт не соответствуют 4,5,3026,3027,7286 члены буфера в чем может быть проблемма.
  • brother © (25.09.08 12:57) [1]
    а у тебя ping устойчивый? те пакеты не теряются? как вариант...
  • brother © (25.09.08 12:57) [2]
    проблеммы с оперативой?
  • Сергей М. © (25.09.08 14:14) [3]

    > И приемная и передающая сторона отправляет.принимает равное
    > количество байт


    Это тебе только кажется.
    Разнеси свой приемник и передатчик по разным углам Тырнета и твоя логика тут же рухнет как карточный домик.
  • santey (26.09.08 08:42) [4]
    Сергей М. что в моей логике не так?

    Все делается на одгой машине т.е. ip 127.0.0.1

    С оперативой проблемм нет
  • Сергей М. © (26.09.08 09:49) [5]

    > Все делается на одгой машине т.е. ip 127.0.0.1


    Ты же, наверно, не для локальной машины программу делаешь, а для работы в сети)

    Вот я и говорю тебе - в "боевых" условиях твоя программа работать не будет.


    > что в моей логике не так?


    recv - это функция !

    А функция, как известно, возвращает результат.
    И результат этот несет вполне определенную смысловую нагрузку.
    А ты на это начхал)
  • Сергей М. © (26.09.08 09:54) [6]

    > p:pchar;
    > l:integer;
    > begin
    > l:=ms.size;
    > getmem(p,l+1);
    > ms.read(p^,l);
    > send(l,sizeof(l),0);
    > i:=send(server,p^,l,0);
    > end;
    >


    Тоже самое касается функции send().

    Кстати, а зачем эти непонятные телодвижения с промежуточным буфером ?
    У MemoryStream есть св-во Memory, которое указывает на буфер, где лежат данные. Не вижу никакого резона делать копию этих данных для передачи.
  • santey (26.09.08 10:30) [7]
    Я интересуюсь почему данные приходят не все?
    Даже если я разбиваю на блоки скажем по 4000 байт в одних и тех же членах Char несоответствие с исходным?
  • Сергей М. © (26.09.08 11:18) [8]

    > почему данные приходят не все?


    Потому что у тебя куча ошибок в программе.
    Приводи реальный код, а не его огрызки, набросанные сюда на скорую руку.
  • Сергей М. © (26.09.08 11:45) [9]

    > приемная и передающая сторона отправляет.принимает равное
    > количество байт


    > данные приходят не все


    Сам себе противоречишь.
  • santey (26.09.08 17:29) [10]
    размер буфера 1030454 байт
    Сравнивая буфер на приемной стороне и на передающией:
    выявляются что с 1 по 3 члены буфера совпадают, 4,5 не совпадают с 6 по 3025 совпадают 3026,3027 не совпадают с 3028 по 7285 сопадают 7286 не совпадают остальные совпадают вот весь код.
    клиент:
    var
     Form1: TForm1;
     client:tsocket;
     tms:tmemorystream;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    p,p1:pchar;
    s,s1:string;
    l,l1,i:integer;
    begin
    client:= connectclient();
    if client=0 then exit;

    button1.Caption:='OK';
    readclient(client,tms);
    end;

    function TForm1.connectclient(): tsocket;
    var
    TW:TWSADATA;
    adr:TSockAddr;
    u:Twsanetworkevents;
    heven:thandle;
    a1,a2,i,opt,s:integer;
    readf:Tfdset;
    writef:Tfdset;
    tv:ttimeval;
    opt1:pchar;
    client:tsocket;
    begin
    WSAStartUp(MAKEWORD(2,0),TW);
    adr.sin_family:=AF_INET;
    adr.sin_port:=htons(3333);
    adr.sin_addr.S_addr:=inet_addr(Pchar('127.0.0.1'));
    client:=socket(af_inet,sock_stream,ipproto_ip);
    connect(client,@adr,sizeof(adr));

    if not waitwrite(client) then
    begin
    result:=0;
    exit;
    end
    else
    begin
    result:=client;
    exit;
    end;
    end;

    function TForm1.readclient(socket: tsocket; ms:tmemorystream): integer;
    var
    l,blok,i,k,ost:integer;
    p:pchar;
    p1:array[1..4000] of char;
    begin
    k:=0;
    while not waitread(socket) do
     application.ProcessMessages;
    recv(socket,l,sizeof(l),0);
    getmem(p,l+1);
    while not waitread(socket) do
     application.ProcessMessages;
    k:=recv(socket,p^,l,0);
    tms.Write(p^,l);
    result:=k;
    end;

    Function Tform1.waitread(socket:tsocket):boolean;
    var
    setf:Tfdset;
    tv:ttimeval;
    begin
    fd_zero(setf);
    tv.tv_sec:=0;
    tv.tv_usec:=1;
    fd_set(socket,setf);
    select(1,@setf,nil,nil,@tv);
    result:=fd_isset(socket,setf);
    end;

    function TForm1.waitwrite(socket: tsocket): boolean;
    var
    setf:Tfdset;
    tv:ttimeval;
    begin
    fd_zero(setf);
    tv.tv_sec:=0;
    tv.tv_usec:=1;
    fd_set(socket,setf);
    select(1,nil,@setf,nil,@tv);
    result:=fd_isset(socket,setf);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    tms:=tmemorystream.Create;
    end;
    end.

    сервер:

    var
     Form1: TForm1;
     server:tsocket;
     tms,tms2:tmemorystream;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if opend.Execute then
     image1.Picture.Bitmap.LoadFromFile(opend.FileName);
    server:=startserver();
    button3.Enabled:=true;
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    begin
    image1.Picture.Bitmap.SaveToStream(tms);
    label1.Caption:=inttostr(sendseerv(tms));
    end;

    Function tform1.startserver:tsocket;
    var
    TW:TWSADATA;
    adr:TSockAddr;
    serv:TSocket;
    a1,a2,i,opt,s:integer;
    begin
    WSAStartUp(MAKEWORD(2,0),TW);
    adr.sin_family:=AF_INET;
    adr.sin_port:=htons(3333);
    adr.sin_addr.S_addr:=inet_addr(Pchar('127.0.0.1'));
    serv:=socket(af_inet,sock_stream,ipproto_ip);
    bind(serv,@adr,sizeof(adr));
    listen(serv,10);
    while not (waitread(serv)) do
     application.ProcessMessages;

    label1.Caption:='list';
    result:=accept(serv,adr,a1);
    end;

    Function Tform1.waitread(socket:tsocket):boolean;
    var
    setf:Tfdset;
    tv:ttimeval;
    begin
    fd_zero(setf);
    tv.tv_sec:=0;
    tv.tv_usec:=1;
    fd_set(socket,setf);
    select(1,@setf,nil,nil,@tv);
    result:=fd_isset(socket,setf);
    end;

    function TForm1.waitwrite(socket: tsocket): boolean;
    var
    setf:Tfdset;
    tv:ttimeval;
    begin
    fd_zero(setf);
    tv.tv_sec:=0;
    tv.tv_usec:=1;
    fd_set(socket,setf);
    select(1,nil,@setf,nil,@tv);
    result:=fd_isset(socket,setf);
    end;

    function TForm1.sendseerv(ms: tmemorystream): integer;
    var
    blok,ost,l,i,k:integer;
    p:pchar;
    begin
    k:=0;
    l:=ms.Size;
    send(server,l,sizeof(l),0);
    getmem(p,l+1);
    ms.Read(p^,l);
    k:=send(server,p^,l,0);
    result:=k;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    tms:=tmemorystream.Create;
    end;

    end.

    В ЧЕМ ОШИБОЧКИ ЗА РАНЕЕ СПАСИБО
  • Сергей М. © (26.09.08 19:35) [11]

    > В ЧЕМ ОШИБОЧКИ ЗА РАНЕЕ СПАСИБО


    Не надо так орать.
    Тебя прекрасно слышно.

    Теперь изложи формальный протокол своего инф.обмена.

    ты вник про функции ?
  • Сергей М. © (26.09.08 19:38) [12]
    Ну и традиционный вопрос - чем тебя не устроили готовые компоненты ?
Есть новые Нет новых   [134432   +19][b:0][p:0.001]