Текущий архив: 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.49 MB
Время: 0.009 c