Текущий архив: 2003.05.19;
Скачать: CL | DM;
ВнизПрограмма с сокетами стала тормозить! Найти похожие ветки
← →
daos (2003-03-21 13:29) [0]Была программа с использованием ServerSocket & ClientSocket (неблокирующие соединения), все нормально работало (отправлялись комады символов по 6 максиум+ текст <100 KB), что-то админ изменил на сервере и теперь зверские тормаза:
Команда на сервер
Команда клиенту
Текст клиету
проходит 1-3 минуты, а раньше за секунды.
Вопрос: с чем это может быть связано.
← →
Digitman (2003-03-21 14:35) [1]
> Вопрос: с чем это может быть связано.
Ответ : связано с тем, что "что-то админ изменил на сервере")
надо понимать, исходников нет ? и оттрассировать ход обмена между сервером и клиентом - ну прямо никак ?
← →
daos (2003-03-21 14:52) [2]Сервер
procedure TFTestServer.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
label
lp;
var
i,j,hndl:integer;
s,ns,gs:string;
toto:Char;
host:string;
begin
host:=socket.RemoteHost+" на "+socket.RemoteAddress;
inc(bil_us );
if chas= StrToInt(FormatDateTime("h",Time))
then begin
if bil_us > kkks
then
for I:=0 to num_us do
if ServerSocket1.Socket.Connections[i].SocketHandle=socket.SocketHandle
then begin
ServerSocket1.Socket.Connections[i].Close;
Memo1.Lines.Add("!!!!!!!!!!!!!");
Memo1.Lines.Add("лишний пользователь в "+IntToStr(kkks div 2)+ " пользовательской системе");
Memo1.Lines.Add("Отказано в доступе для "+host);
Memo1.Lines.Add("!!!!!!!!!!");
end;
end;
if chas <> StrToInt(FormatDateTime("h",Time))then begin
Chas:=StrToInt(FormatDateTime("h",Time));
bil_us:=0;
end;
Vopr.Clear;
label2.Caption:=Socket.RemoteHost;
memo1.Lines.Add(Socket.RemoteHost+" :"+TimeToStr(now));
j:=-1;
hndl:=socket.SocketHandle;
for i:=0 to num_us-1 do
if s_handles[i]=hndl then
begin
j:=i;
break;
end;
if j=-1 then
begin
s_handles[num_us]:=hndl;
num_us:=num_us+1;
end;
if num_us<=0 then num_us:=1;
Label3.Caption:="Количество пользователей: "+IntToStr(num_us);
Label1.Caption:="Использовано: "+IntToStr(bil_us)+" из "+IntTOStr(kkks);
end;
← →
daos (2003-03-21 14:53) [3]
procedure TFTestServer.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
label
Konec;
var
s, sl: string;
Ex:bool;
begin
Ex:=false;
try
try
s:= Socket.ReceiveText;
except
exit;
end;
// Если мы не в режиме приёма:
if not Reciving then
begin
// Теперь нам необходимо получить длину потока данных.
sl:=copy(s,1,Pos("@",s)-1);
try
DataSize:= StrToInt(sl);
Delete(s, 1, Length(sl)+1);
except
DataSize:=0;
//Ex:=true;
end;
if not Ex then begin
Reciving:= true;
ad:="net adr"; //socket.RemoteHost;
hvs:=socket.SocketHandle;
Data:= TMemoryStream.Create;
// Удаляем информацию о размере из данных.
end;
end;
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
if not Ex then begin
try
if true //hvs = socket.SocketHandle
then
Data.Write(s[1], length(s));
if Data.Size >= DataSize then
begin
Data.Position:= 0;
data.Position:=0;
AnalisText(Data,ad);
Data.Free;
Reciving:= false;
end;
except
Data.Free;
end;
end;
except
Memo1.Lines.Add("");
Memo1.Lines.Add("/////////////////////");
Memo1.Lines.Add("Ошибка чтения сокета");
Memo1.Lines.Add("//////////////////////");
Memo1.Lines.Add("");
RECIVING:=false;
try
Data.Free;
except
end;
end;
end;
procedure AnalisText(ms:TMemoryStream;ad:string);
var com:string;
i,j:integer;
fno,text,s:string;
begin
try
fn:="";
fno:="";
setlength(s,ms.size);
ms.Position:=0;
ms.Read(s[1],ms.size);
//FTestServer.Memo1.Lines.Add(ad+": "+s);
ms.Position:=pos("@",s);
setlength(com,6);
ms.Read(com[1],6);
//ShowMessage(com);
FTestServer.memo1.Lines.Add(ad +" : "+com);
FTestServer.memo1.Lines.Add("");
if com[1]="#" then
begin
if com="#fvopr" then
begin
setlength(text,ms.size);
ms.Read(text[1],ms.Size);
fn:="";
for i:=1 to length(text) do
if text[i]<>"|" then
fn:=fn+text[i]
else begin
break;
end;
s:="";
j:=pos("|",text)+1;
for i:=j to length(text) do
if text[i]<>"*" then
s:=s+text[i]
else break;
//ShowMessage(s);
if poslal(fn) then otvetvopr(fn,s);
end;
end;
except
FTestServer.Memo1.Lines.Add(" ");
FTestServer.Memo1.Lines.Add("///////////////////////////////");
FTestServer.Memo1.Lines.Add("Ошибка анализа текста!");
FTestServer.Memo1.Lines.Add("///////////////////////////////");
FTestServer.Memo1.Lines.Add(" ");
end;
end;
← →
daos (2003-03-21 14:54) [4]
procedure OtvetVopr(fn:string;ad:string);
var i:integer;
ms:TMemoryStream;
s:string;
begin
if FileExists (fn)=true then
begin
try
Vopr.Clear;
ms:=TMemoryStream.Create;
Vopr.LoadFromFile(fn);
Vopr.Insert(0,"#fvopr");
Vopr.SaveToStream(ms);
ms.Position:=0;
FTestServer.CryptNet.EncryptMemory(ms);
ms.Position:=0;
for i:=0 to num_us-1 do
if FTestServer.ServerSocket1.Socket.Connections[i].RemoteAddress=ad //SocketHandle=hvs then
then begin
FTestServer.ServerSocket1.Socket.Connections[i].SendText(IntToStr(ms.Size)+"@");
FTestServer.ServerSocket1.Socket.Connections[i].SendStream(ms);
break;
end;
except
ms.Free
end;
end;
end;
Клиент:
procedure TFTestKlient.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s, sl: string;
begin
if not HaveTest then begin
try
try
s:= Socket.ReceiveText;
except
exit;
end;
// Если мы не в режиме приёма:
if not Reciving then
begin
Reciving:= true;
// Теперь нам необходимо получить длину потока данных.
sl:=copy(s,1,Pos("@",s)-1);
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
// Удаляем информацию о размере из данных.
Delete(s, 1, Length(sl)+1);
end;
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
FTestKlient.CryptNet.DecryptMemory(data);
Data.Position:=0;
AnalisText(Data);
Data.Free;
Reciving:= false;
end;
except
Data.Free;
end;
except
try
Data.Free;
except
end;
Reciving:=false;
end;
end;
end;
procedure AnalisText (ms2:TMemoryStream);
var
com:string;
begin
ms2.Position:=0;
setlength(com,6);
ms2.Read(com[1],6);
with FTestKlient do begin
if com="#fvopr" then
begin
if not EstVopros then
begin
VoprosL.Clear;
try
ms2.Position:=0;
VoprosL.Clear;
VoprosL.LoadFromStream(ms2);
except
end;
VoprosL.Delete(0);
button1.Enabled:=true;
button1.CanFocus;
button1.Tag:=0;
try
nebolvopr:=StrToInt(VoprosL.Strings[0]);
except
on EConvertError do nebolvopr:=-1;
end;
VoprosL.Delete(0);
end;
end
else if com="#ucheb"
then begin
provk:=false;
if findwindow("TFLogon",nil)<>0
then begin FLogon.RadioButton2.Enabled:=false;
FLogon.RadioButton1.Checked:=true;
end;
end
else if com="#provr"
then begin
provk:=true;
if perras=false then
if findwindow("TFLogon",nil)<>0
then begin
FLogon.RadioButton2.Enabled:=true;
FLogon.RadioButton1.Checked:=true;
end;
end ;
end;
FTestKlient.button1Click(FTestKlient.button1);
end;
Когда запускаю с F7 (по шагам) проблем не наблюдается (тормазит только везде где есть S:=Socket.RemoteHost))
А когда запускаю в обычном режиме...
На одной машине все работает!
← →
Digitman (2003-03-21 15:02) [5]если время на получение сервером имени хоста клиента (вызов socket.RemoteHost) входит в общее время сеанса инф.обмена, то вполне возможно, что админом где-то были изменены какие-то настройки DNS
← →
daos (2003-03-21 15:13) [6]Проблема в том что когда я кидаю в комментарий все вызовы socket.RemoteHost(т.к. они нужна только для лога), а вместо Использования св-ва Host использую Adres (IP) тормаза не уходят.
При етом приложение сервер явно зависает(т.е. не реагирует на мыша и т.п.).
Понимаю что звучит как бред, но ето есть, и очень хочеться победить.
А админ менял что-то с ДНС и WINS и ОС с NT на 2000 (вроде бы).
Помогите бедному студенту плиз!
← →
Digitman (2003-03-21 15:25) [7]а почему ты думаешь, что проблема - именно на серверной стороне ?
← →
daos (2003-03-21 15:48) [8]Потому что весит сервер (т.е. окно замерзает после отсылки с клиента), похоже надо код смотреть-чего-тотам не то...
← →
daos (2003-03-21 15:49) [9]Вот эта прога работает нормально
unit USocket1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Edit4: TEdit;
Label2: TLabel;
Button2: TButton;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit1.text;
ClientSocket1.Port:=StrToInt(Edit2.text);
if not ClientSocket1.Active then
begin
ClientSocket1.Open;
while not ClientSocket1.Active do
Application.ProcessMessages;
end;
if ClientSocket1.Socket.SendText(Edit3.Text) <>0
then begin
Memo1.Lines.Add("Poslal");
end;
ClientSocket1.Close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ServerSocket1.Port:=StrToInt(Edit4.text);
if not ServerSocket1.Active then
begin
ServerSocket1.Open;
while not ServerSocket1.Active do
Application.ProcessMessages;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label2.Caption:=socket.ReceiveText;
Memo1.Lines.Add(Label2.Caption);
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add("connekt");
end;
end.
← →
Digitman (2003-03-21 16:15) [10]так эта "прога" - на одной и той же лок.машине и сервер и клиент) ... еще бы она не работала)
← →
daos (2003-03-21 16:19) [11]
> Digitman © (21.03.03 16:15)
> так эта "прога" - на одной и той же лок.машине и сервер
> и клиент) ... еще бы она не работала)
Неа я запускаю на разных машинах, и сообщения приходят с одной на другую, просто направлени здесь одно от клиента к серверу.
← →
daos (2003-03-21 16:20) [12]
> Digitman
Глянь код плз. (я конечно понимаю что очень наглый, но тем не менее)!
← →
Digitman (2003-03-21 16:36) [13]а что глядеть ? ты оттрассируй код проблемного сервера, локализуй строчки подозрительные - будем разбираться, почему ...
Страницы: 1 вся ветка
Текущий архив: 2003.05.19;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.008 c