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

Вниз

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

Наверх





Память: 0.49 MB
Время: 0.01 c
3-1147761663
mr.il
2006-05-16 10:41
2006.07.16
передать параметр в IBDataSet


2-1151338247
Chort
2006-06-26 20:10
2006.07.16
сохранение настроек


2-1151323893
VeB
2006-06-26 16:11
2006.07.16
Закрытие окна


1-1149229591
WhiteBarin
2006-06-02 10:26
2006.07.16
Опрос в бесконечном цикле блокирует программу


15-1150446709
LingvoRu
2006-06-16 12:31
2006.07.16
Мощная фраза





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