Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.065 c
3-1083617193
SergP
2004-05-04 00:46
2004.05.30
Модификация записей в одной таблице сразу из двух TAdoQuery.


14-1084182274
Шнур
2004-05-10 13:44
2004.05.30
MS SQL Server


14-1084455006
Razor
2004-05-13 17:30
2004.05.30
Программирование для мобильников


14-1084414890
Думкин
2004-05-13 06:21
2004.05.30
С днем рождения! 13 мая


3-1083730588
Kate
2004-05-05 08:16
2004.05.30
Можно ли соединить записи из двух баз данных в одну?