Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

non-blocking   Найти похожие ветки 

 
DED_MustDie   (2004-04-12 23:53) [0]

Здраствуйте уважаемые мастера! Помогите разобраться с работой сокетов в режиме non-blocking. Вообщем непонятно как правильно отправлять данные в этом режиме? Сам сижу какой день и немогу разобраться. Вот моя тест-прога: если при отправке сервером N - небольшое то все корректно доходит. Если же N>6000 то либо не все данные доходят (только 4000-5000), либо у клиента выскакивает ошибка.
глобальные переменные:
 
 bufin       : array [1..BUF_SIZE] of Byte; // BUF_SIZE = 8196
 PrefixRead  : boolean;
 ms          : TStringStream;
 prefix      : Integer;
 err,yetwrite: Integer;
 CanSend     : Boolean;  

{server: TServerSocket; client: TClientSocket}

procedure TForm1.serverClientWrite(Sender: TObject;
 Socket: TCustomWinSocket);
begin
CanSend:=True;
end;

{====== отсылка данных сервером клиенту =============}

procedure TForm1.Button1Click(Sender: TObject);
var
s    : string;
z    : word;
i,N  : integer;
size : integer;
begin
N:=StrToInt(edit1.Text);
for i:=1 to N do
begin
 s:=inttostr(i);
 size:=length(s);
 repeat
  z:=server.Socket.Connections[0].SendBuf(size,sizeOf(size));
  if z<=0 then
  begin
   CanSend:=False;
   while not CanSend do
    Application.ProcessMessages;
  end
 until z>0;
 repeat
  z:=server.Socket.Connections[0].SendBuf(s[1],size);
  if z<=0 then
  begin
   CanSend:=False;
   while not CanSend do
    Application.ProcessMessages;
  end
 until z>0;
end;

{============== прием данных клиентом =========================}
procedure TForm1.clientRead(Sender: TObject; Socket:  TCustomWinSocket);
begin
if PrefixRead then
begin
 err:=socket.ReceiveBuf(bufin[yetwrite+1],prefix-yetwrite);
 memo2.Lines.Add(inttostr(err)); // для отладки
 if (err=-1) then
 begin
  socket.Disconnect(socket.Handle);
  exit
 end;
 yetwrite:=yetwrite+err;
 if yetwrite=prefix then
 begin
  ms.WriteBuffer(bufin[1],prefix);
  ms.Position:=0;
  // обрабатываю полученные данные
  memo1.Lines.Add(ms.DataString); // для отладки
  ms.Free;
  PrefixRead:=False;
  yetwrite:=0;
 end;
end
else begin
 err:=socket.Receivebuf(prefix,sizeOf(prefix));
 memo2.Lines.Add(inttostr(err)); // для отладки
 if (err=-1) then
 begin
  socket.Disconnect(socket.Handle);
  exit
 end;
 ms:=TStringStream.Create("");
 yetwrite:=0;
 PrefixRead:=True;
end;
end;

Заранее благодарен за помощь!


 
-==-   (2004-04-13 01:47) [1]

Смотри Ветки по сканерам портов. Там должно быть описание работы в данном режиме.


 
DED_MustDie   (2004-04-13 09:26) [2]

Сам посидел и исправил процедуру передачи. Вроде работает)):

procedure TForm1.Button1Click(Sender: TObject);
var
s     : string;
z,len : integer;
i,N   : integer;
size  : integer;
begin
N:=StrToInt(edit3.Text);
for i:=1 to N do
begin
 s:=inttostr(i);
 size:=length(s);
 repeat
  z:=server.Socket.Connections[0].SendBuf(size,sizeOf(size))
  if z=-1 then
  begin
   cansend:=False;
   while not cansend do
    Application.ProcessMessages
  end
  until z=sizeOf(size);
  len:=0;
  repeat
   z:=server.Socket.Connections[0].SendBuf(s[1+len],size-len);
   if z=-1 then
   begin
    cansend:=False;
    while not cansend do
    Application.ProcessMessages
   end
   else
    len:=len+z;
  until (len=size);
end;

Но возник вопрос: Если размера внутреннего буфера Winsock не хватит для передачи моего буфера, то SenBuf вернет -1. Это значит что никакие данные небыли помещены в очередь отправки. А может ли быть такая ситуация, когда например половина буфера ушла в очередь, а половина нет (как в случае с sendtext-ом)? Тоесть можно ли обойтись в моём коде без маипуляции с len? Прочитал хэлп, но так и  понял.


 
Verg ©   (2004-04-13 09:49) [3]

SendBuf вернет SOCKET_ERROR, а WSAGetLastError при этом будет равен WSAEWOULDBLOCK - это значит, что ни один байт из указанного буфера не был перемещен в передающий буфер сокета.
На счет sendtext, смотрим:

function TCustomWinSocket.SendText(const s: string): Integer;
begin
 Result := SendBuf(Pointer(S)^, Length(S));
end;


Т.е. sendtext - это такой же sendbuf, только вид сбоку.


 
DED_MustDie   (2004-04-13 14:25) [4]

Verg спасибо за  ответ, разобрался.  
з.ы что-то я стормозил: исходники сразу не посмотрел...



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.034 c
11-1073511541
reagent
2004-01-08 00:39
2004.05.30
Глюки ICS


7-1082487224
Shopot
2004-04-20 22:53
2004.05.30
Пароль.


14-1084129697
James Stuart
2004-05-09 23:08
2004.05.30
Вопрос по Виндам 98


14-1084047738
Swed
2004-05-09 00:22
2004.05.30
Справка о справке


3-1083845681
Wolferio
2004-05-06 16:14
2004.05.30
Сервер!!!???





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский