Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];

Вниз

Программа с сокетами стала тормозить!   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
7-59957
Bartov
2003-03-20 05:55
2003.05.19
Метки дисков


3-59630
_qwerty_
2003-04-29 05:10
2003.05.19
Sql запрос не идёт


14-59893
Style
2003-04-25 08:46
2003.05.19
У кого нить есть пример алгоритма сортировки слиянием MergeSort!


14-59855
alexsys
2003-05-01 10:11
2003.05.19
С праздником!


1-59693
alt7
2003-05-05 14:34
2003.05.19
TApplication





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