Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.061 c
15-1270622504
bss
2010-04-07 10:41
2010.08.27
Глюки Miranda...


9-1184586954
Shurik_
2007-07-16 15:55
2010.08.27
Как повернуть текс в OenGL на любой угол


2-1273851859
Shurick
2010-05-14 19:44
2010.08.27
Графика


2-1274344276
zamtmn
2010-05-20 12:31
2010.08.27
unicode->ascii


15-1270539779
Игорь
2010-04-06 11:42
2010.08.27
Yandex Деньги через SMS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский