Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Внизwinsock2 Найти похожие ветки
← →
santey (2008-09-25 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 © (2008-09-25 12:57) [1]а у тебя ping устойчивый? те пакеты не теряются? как вариант...
← →
brother © (2008-09-25 12:57) [2]проблеммы с оперативой?
← →
Сергей М. © (2008-09-25 14:14) [3]
> И приемная и передающая сторона отправляет.принимает равное
> количество байт
Это тебе только кажется.
Разнеси свой приемник и передатчик по разным углам Тырнета и твоя логика тут же рухнет как карточный домик.
← →
santey (2008-09-26 08:42) [4]Сергей М. что в моей логике не так?
Все делается на одгой машине т.е. ip 127.0.0.1
С оперативой проблемм нет
← →
Сергей М. © (2008-09-26 09:49) [5]
> Все делается на одгой машине т.е. ip 127.0.0.1
Ты же, наверно, не для локальной машины программу делаешь, а для работы в сети)
Вот я и говорю тебе - в "боевых" условиях твоя программа работать не будет.
> что в моей логике не так?
recv - это функция !
А функция, как известно, возвращает результат.
И результат этот несет вполне определенную смысловую нагрузку.
А ты на это начхал)
← →
Сергей М. © (2008-09-26 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 (2008-09-26 10:30) [7]Я интересуюсь почему данные приходят не все?
Даже если я разбиваю на блоки скажем по 4000 байт в одних и тех же членах Char несоответствие с исходным?
← →
Сергей М. © (2008-09-26 11:18) [8]
> почему данные приходят не все?
Потому что у тебя куча ошибок в программе.
Приводи реальный код, а не его огрызки, набросанные сюда на скорую руку.
← →
Сергей М. © (2008-09-26 11:45) [9]
> приемная и передающая сторона отправляет.принимает равное
> количество байт
> данные приходят не все
Сам себе противоречишь.
← →
santey (2008-09-26 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.
В ЧЕМ ОШИБОЧКИ ЗА РАНЕЕ СПАСИБО
← →
Сергей М. © (2008-09-26 19:35) [11]
> В ЧЕМ ОШИБОЧКИ ЗА РАНЕЕ СПАСИБО
Не надо так орать.
Тебя прекрасно слышно.
Теперь изложи формальный протокол своего инф.обмена.
ты вник про функции ?
← →
Сергей М. © (2008-09-26 19:38) [12]Ну и традиционный вопрос - чем тебя не устроили готовые компоненты ?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.071 c