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

Вниз

TIdUDPClient в Threade рвет соединение с ошибкой 10054   Найти похожие ветки 

 
Каспер   (2006-03-10 07:23) [0]

Доброе время суток.
Поток периодически должен коннектиться к серверу КС посылать ему команды и принимать ответ по УДП - это основное условие :(.
У меня соединение устанавливается, отправляется первая команда жду ответа - а вместо него гриться что сокет закрыт с 10054 ошибкой.
Вот так...
[10.03.2006 10:59:48] ***** CS ***** : An network error occured while trying to connect CS Server: Socket Error # 10054
В непоточном режиме - все работало :(((.
Может что то не так сделал.
Код весь переколбасил - бесполезно. Ничего не понимаю.
Дельфи6. ВыньХР, Инди 10.1....

Вот код самого трида

unit u_CS;

interface

uses
 Classes,
 SysUtils,
 Graphics,
 IdUDPClient,
 IdException
 ;

type
 CS = class(TThread)
   i_uc: TIdUDPClient;
 private
   FSb4:string;
   FSb5:string;
   procedure Info;
   procedure Status;
   { Private declarations }
 protected
   procedure Execute; override;
 public
   FDelay:cardinal;
   FSRV:string;
   FPort:integer;
   FPass:string;
   FSayClient:boolean;
   FSayCheater:boolean;
   FKickClient:boolean;
   FKickCheater:boolean;
   FSayClientText:string;
   FSayCheatText:string;
 end;

implementation

uses
 u_Srv_Main;

{ CS }

procedure CS.Info;
begin
 f_Main.sb_Main.Panels[4].Text:=FSb4;
 f_Main.sb_Main.Panels[5].Text:=FSb5;
end;

procedure CS.Status;
var
 c:TColor;
begin
 if i_uc.Connected then c:=clGreen else c:=clRed;
 f_Main.p_CS_Status.Color:=c;
end;

procedure CS.Execute;
var
 FStatus:TStringList;
 FPreComm:string;
 s,tmps:string;
 i,j:integer;
 P,E:PChar;
begin
 FreeOnTerminate := True;

 i_uc:=TIdUDPClient.Create(nil);
 FStatus:=TStringList.Create;

 i_uc.ReceiveTimeout:=2000;
 i_uc.Host:=FSRV;
 i_uc.Port:=FPort;

 try
   f_Main.AddLog("***** CS ***** : Connecting to CS server..."+FSRV+":"+inttostr(FPort),LogF);
   i_uc.Connect;
   try
     Synchronize(Status);
     if i_uc.Connected then begin

       f_Main.AddLog("***** CS ***** : CS Server started.",LogF);//+IntToStr(ss_Srv.Port));
       FSb4:="Без клиентов с "+DateTimeToStr(Now)+" 0";
       FSb5:="Читеров с "+DateTimeToStr(Now)+" 0";
       Synchronize(Info);
       while not Terminated do begin
         if FPreComm="" then begin

           s:=#255#255#255#255"challenge rcon";
           f_Main.AddLog("***** CS ***** : Getting challenge from CS server..."+s,LogF);
           i_uc.Send(s);
           if Terminated then break;
           s:=i_uc.ReceiveString;

           if Terminated then break;
           //проблемы с полученым challengem
 //          if length(s)<7 then Exit;
           i:=pos("rcon",s);
 //          if i=0 then Exit;
           FPreComm:=#255#255#255#255"rcon "+copy(s,i+5,length(s)-i-6)+" ""+FPass+"" ";
           f_Main.AddLog("***** CS ***** : Successfull! Precomm="+FPreComm,LogF);
         end;//if
         s:=FPreComm+"status"#0;
         i_uc.Send(S);
         if Terminated then break;
         f_Main.AddLog("***** CS ***** : Getting Status from CS server...",LogF);
         s:="";
         repeat
           tmps:=i_uc.ReceiveString(1000);
           if Terminated then break;
           if tmps<>"" then s:=s+tmps;
         until tmps="";
         if Terminated then break;

       //если БЭД челендж то получить новый
 //      if copy(s,1,4)=#254#255#255#255 then Exit;
         f_Main.AddLog("***** CS ***** : Successfull!",LogF);
         if (not (FSayClient or FSayCheater or FKickClient or FKickCheater))or(s="") then Exit;
 //////          if pos("Bad ",s)=0 then

         FStatus.Text:=S;
         for i:=0 to FStatus.Count-1 do
           f_Main.AddLog("***** CS ***** : "+FStatus.Strings[i],LogF);
         for i:=0 to 6 do FStatus.Delete(0);
         FStatus.Delete(FStatus.Count-1);

         for i:=0 to FStatus.Count-1 do if (length(FStatus.Strings[i])>0) then begin
           s:=trim(copy(FStatus.Strings[i],4,length(FStatus.Strings[i])-5));
           s:=copy(s,2,length(s)-1);
           E:=PChar(s);
           P:=E;
           inc(E,StrLen(P)-1);
           repeat
             dec(E);
           until E^=" ";
           j:=abs(integer(E)-integer(P))+2;

           tmps:=copy(s,1,pos(""",s)-1);
           s:=copy(s,j,length(s)-j+1);
           s:=copy(s,1,pos(":",s)-1);

           FStatus.Strings[i]:=s+"*"+tmps;
           f_Main.AddLog("***** CS ***** : "+FStatus.Strings[i],Logf);
         end;//for
         if Terminated then break;
         for i:=0 to FStatus.Count-1 do
           if f_Main.lb_Users.Items.IndexOf(copy(FStatus.Strings[i],1,pos("*",FStatus.Strings[ i])-1))<0 then begin

             if FSayClient then begin
               s:=FPreComm+"say ""+copy(FStatus.Strings[i],pos("*",FStatus.Strings[i])+1,length(FStatus.Strings[i])-pos("*",FStatus.Strings[i]))+" - "+FSayClientText+"""+#0;
               f_Main.AddLog("***** CS ***** : Sending command "+s,Logf);
               if Terminated then break;
               i_uc.Send(s);
             end;//if
             if FKickClient then begin
               s:=FPreComm+"kick ""+copy(FStatus.Strings[i],pos("*",FStatus.Strings[i])+1,length(FStatus.Strings[i])-pos("*",FStatus.Strings[i]))+"""+#0;
               f_Main.AddLog("***** CS ***** : Sending command "+s,Logf);
               if Terminated then break;
               i_uc.Send(S);
             end;//if
             if FSayCheater then begin
               s:=FPreComm+"say ""+copy(FStatus.Strings[i],pos("*",FStatus.Strings[i])+1,length(FStatus.Strings[i])-pos("*",FStatus.Strings[i]))+" - "+FSayCheatText+"""+#0;
               f_Main.AddLog("***** CS ***** : Sending command "+s,Logf);
               if Terminated then break;
               i_uc.Send(s);
             end;//if
             if FKickCheater then begin
               s:=FPreComm+"kick ""+copy(FStatus.Strings[i],pos("*",FStatus.Strings[i])+1,length(FStatus.Strings[i])-pos("*",FStatus.Strings[i]))+"""+#0;
               f_Main.AddLog("***** CS ***** : Sending command "+s,Logf);
               if Terminated then break;
               i_uc.Send(S);
             end;//if
           end;//if
         if Terminated then break;
         Synchronize(Status);
         Sleep(FDelay);
       end;//while
     end;//if
   finally
     i_uc.Disconnect;
     Synchronize(Status);
     FreeAndNil(i_uc);
     FreeAndNil(FStatus);
   end;//fin
 except
   on E: EIdException do begin
     f_Main.AddLog("***** CS ***** : An network error occured while trying to connect CS Server: "+E.Message,LogF);
     //id_Srv.Active:=false;
   end;//on
   on E: Exception do begin
     f_Main.AddLog("***** CS ***** : An unknown error occured while trying to connect CS Server: "+E.Message,LogF);
     //id_Srv.Active:=false;
   end;//on
 end;//exc
 { Place thread code here }
end;

end.

Спасибо


 
Сергей М. ©   (2006-03-10 09:02) [1]

i_uc.Send(s);
if Terminated then break;
s:=i_uc.ReceiveString; // <- исключение возбуждается именно здесь ?


 
Kacnep ©   (2006-03-10 10:07) [2]

Простите Сергей.
Все из-за невнимательности.. :( просто порт не тот передавал в трид :(((
Сам вопрос снят.
Но есть маленькин подвопрос.
Сейчас буду искать в форуме.
Пакеты УДП приходят как попало :(
Надо каким то образом получить всю инфу с КС сервера :( а она приходит частями. Сколько этих частей я не знаю :*(
Может это уже обсуждалось?
Буду благодарен если покажите код парсера пакетов УДП или ткнете носом где уже это было. :(


 
Сергей М. ©   (2006-03-10 10:11) [3]


> Пакеты УДП приходят как попало


Что значит "как попало" ?


 
Kacnep ©   (2006-03-10 10:27) [4]

смотрим тот же код но уже немного причесаный... вернее его кусок

procedure CS.SendComm(aComm:string);
begin
 f_Main.AddLog("***** CS ***** : Sending command: "+aComm,Logf);
 i_uc.Send(aComm+#0);
end;

.....
{имеем нормальный челендж значит можем работать}
         SendComm(FPreComm+"status");
         if Terminated then break;

{!!! Пытаемся собрать из кучи пришедших УДП пакетов один нормальный !!!}
         s:="";
         repeat
           tmps:=i_uc.ReceiveString;
           if Terminated then break;
           if tmps<>"" then s:=s+tmps;
         until tmps="";
         if Terminated then break;
{ Надеюсь собрали в S}

         f_Main.AddLog("***** CS ***** : Answer: "+s,LogF);


на сервере 32 игрока... а пришел только один пакет - вернее только один я захватил! второй части нет... а вдруг еще и третья появиться... а может ведь придти сначала вторая часть а потом первая :(( грутно
смотрим что у нас в логе...


[10.03.2006 14:22:13] ***** CS ***** : Sending command: яяяяrcon 4244989288 "1957" status
[10.03.2006 14:22:17] ***** CS ***** : Answer: яяяяlhostname:  My BEST Server
[09.03.2006 13:34:00] version :  47/1.1.2.5 2834 insecure
[09.03.2006 13:34:00] tcp/ip  :  172.31.61.57:25000
[09.03.2006 13:34:00] map     :  de_cbble at: 0 x, 0 y, 0 z
[09.03.2006 13:34:00] players :  31 active (32 max)
[09.03.2006 13:34:00]
[09.03.2006 13:34:00] #      name userid uniqueid frag time ping loss adr
[09.03.2006 13:34:00] # 1 "CAMOrOH BbICLLIEu O4uCTKu" 562 VALVE_ID_LAN   5 27:12   37    3 172.31.105.70:27005
[09.03.2006 13:34:00] # 2 "ne4eHka HoeT" 573 VALVE_ID_LAN   7 08:18   50    1 172.31.101.99:27005
[09.03.2006 13:34:00] # 3 "neHeTpaTop" 543 VALVE_ID_LAN   7 28:58   36    7 172.31.66.22:27005
[09.03.2006 13:34:00] # 4   "XpeH" 574 VALVE_ID_LAN  12 08:18   41    7 172.31.35.31:27005
[09.03.2006 13:34:00] # 5   "Polo" 569 VALVE_ID_LAN   1 22:19   54    0 172.31.68.246:27005
[09.03.2006 13:34:00] # 6 "GrinGo" 555 VALVE_ID_LAN   0 28:51   44    1 172.31.41.57:27005
[09.03.2006 13:34:00] # 8 "JIECHUK MAKC(6POCUJI nUTb)" 536 VALVE_ID_LAN   1 29:00   52    1 172.31.92.101:27005
[09.03.2006 13:34:00] # 9 "XyenyTa/IO" 538 VALVE_ID_LAN   0 28:59   39    3 172.31.58.79:27005
[09.03.2006 13:34:00] #10 "XEPBAM" 547 VALVE_ID_LAN   2 28:56   50    3 172.31.69.69:27005
[09.03.2006 13:34:00] #11     "CA" 550 VALVE_ID_LAN   3 28:54   36    0 172.31.68.224:27005
[09.03.2006 13:34:00] #12    "Dyx" 557 VALVE_ID_LAN   0 28:36  101    0 172.31.231.146:27005
[09.03.2006 13:34:00] #13 "PACCI(I)IC" 559 VALVE_ID_LAN   3 28:07   45    6 172.31.114.178:27005
[09.03.2006 13:34:00] #14  "ZADOV" 554 VALVE_ID_LAN   1 28:52  114    4 172.31.81.226:27005
[09.03.2006 13:34:00] #15 "Ratibor" 583 VALVE_ID_LAN   1 07:50  115    4 172.31.80.34:27005
[09.03.2006 13:34:00] #16  "Limon" 549 VALVE_ID_LAN   0 28:56   46    3 172.31.35.42:27005
[09.03.2006 13:34:00] #17 "ACTAHA" 587 VALVE_ID_LAN   0 03:44   49    4 172.31.88.21:27005
[09.03.2006 13:34:00] 172.31.105.70*CAMOrOH BbICLLIEu O4uCTKu
[09.03.2006 13:34:00] 172.31.101.99*ne4eHka HoeT
[09.03.2006 13:34:00] 172.31.66.22*neHeTpaTop
[09.03.2006 13:34:00] 172.31.35.31*XpeH
[09.03.2006 13:34:01] 172.31.68.246*Polo
[09.03.2006 13:34:01] 172.31.41.57*GrinGo
[09.03.2006 13:34:01] 172.31.92.101*JIECHUK MAKC(6POCUJI nUTb)
[09.03.2006 13:34:01] 172.31.58.79*XyenyTa/IO
[09.03.2006 13:34:01] 172.31.69.69*XEPBAM
[09.03.2006 13:34:01] 172.31.68.224*CA
[09.03.2006 13:34:01] 172.31.231.146*Dyx
[09.03.2006 13:34:01] 172.31.114.178*PACCI(I)IC
[09.03.2006 13:34:01] 172.31.81.226*ZADOV
[09.03.2006 13:34:01] 172.31.80.34*Ratibor
[09.03.2006 13:34:01] 172.31.35.42*Limon


 
Сергей М. ©   (2006-03-10 11:23) [5]


> второй части нет


А ее может вообще и не быть ..  Ведь UDP - протокол без гарантии доставки дейтаграмм !


> может ведь придти сначала вторая часть а потом первая


С чего бы вдруг ?
В какой последовательности дейтаграммы отправлялись передатчиком, в такой же последовательности они должны быть приняты приемником ...

Другой вопрос, что какие-то дейтаграммы (из последовательности отправленных) из-за негарантированности их доставки могут отсутствовать в последовательности принятых


 
Kacnep ©   (2006-03-10 13:05) [6]

Лааддно... фиг с ними пока все другое наколбашу...
Спасибо Сергей за внимание.



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
1-1149499843
Тфьу
2006-06-05 13:30
2006.07.16
Выбранная запись в cxGrid


1-1149500016
Kolan
2006-06-05 13:33
2006.07.16
Как использовать только часть массива?


5-1135000220
Vaitek_
2005-12-19 16:50
2006.07.16
Ручная прорисовка TEdit


2-1151418657
guitarist
2006-06-27 18:30
2006.07.16
Проблемы с blockwrite.


4-1144313939
Eraser
2006-04-06 12:58
2006.07.16
Fast User Switching и интерактивный сервис.