Форум: "Сети";
Текущий архив: 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.041 c