-
Уважаемые помогите мне с таким вопросом. Сеть на низком уровне. отправляю данные некого 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 члены буфера в чем может быть проблемма.
-
а у тебя ping устойчивый? те пакеты не теряются? как вариант...
-
проблеммы с оперативой?
-
> И приемная и передающая сторона отправляет.принимает равное > количество байт
Это тебе только кажется. Разнеси свой приемник и передатчик по разным углам Тырнета и твоя логика тут же рухнет как карточный домик.
-
Сергей М. что в моей логике не так?
Все делается на одгой машине т.е. ip 127.0.0.1
С оперативой проблемм нет
-
> Все делается на одгой машине т.е. ip 127.0.0.1
Ты же, наверно, не для локальной машины программу делаешь, а для работы в сети)
Вот я и говорю тебе - в "боевых" условиях твоя программа работать не будет.
> что в моей логике не так?
recv - это функция !
А функция, как известно, возвращает результат. И результат этот несет вполне определенную смысловую нагрузку. А ты на это начхал)
-
> 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, которое указывает на буфер, где лежат данные. Не вижу никакого резона делать копию этих данных для передачи.
-
Я интересуюсь почему данные приходят не все? Даже если я разбиваю на блоки скажем по 4000 байт в одних и тех же членах Char несоответствие с исходным?
-
> почему данные приходят не все?
Потому что у тебя куча ошибок в программе. Приводи реальный код, а не его огрызки, набросанные сюда на скорую руку.
-
> приемная и передающая сторона отправляет.принимает равное > количество байт
> данные приходят не все
Сам себе противоречишь.
-
размер буфера 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.
В ЧЕМ ОШИБОЧКИ ЗА РАНЕЕ СПАСИБО
-
> В ЧЕМ ОШИБОЧКИ ЗА РАНЕЕ СПАСИБО
Не надо так орать. Тебя прекрасно слышно.
Теперь изложи формальный протокол своего инф.обмена.
ты вник про функции ?
-
Ну и традиционный вопрос - чем тебя не устроили готовые компоненты ?
|