Главная страница
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.025 c
14-1084425781
Мазут Береговой
2004-05-13 09:23
2004.05.30
Ужасные новости для тех, кто собирается долго жить!


3-1084383853
SeregaC
2004-05-12 21:44
2004.05.30
Сохранение БД


14-1083794584
AlerX
2004-05-06 02:03
2004.05.30
RPG что происходит внутри


7-1082126058
Xerx
2004-04-16 18:34
2004.05.30
работа с модемом


14-1084515269
Rule
2004-05-14 10:14
2004.05.30
Направте на правильный путь решения проблеммы..