Главная страница
    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.031 c
6-1081603302
Александр из Минска
2004-04-10 17:21
2004.05.30
Сколько байт осталось переслать?


8-1079695681
Sauron_ua
2004-03-19 14:28
2004.05.30
ПОМОГИТЕ!!!! DirectX Texture


4-1082097782
Zyb
2004-04-16 10:43
2004.05.30
Минимизация окна


3-1084124067
normandia
2004-05-09 21:34
2004.05.30
Перекомпоновать таблицу в SQL запросе


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