Jump to content

[delphi] blad socketa przy odlaczeniu klienta


gomik

Recommended Posts

witam. napisalem prawie komunikator dzialajacy na socketach. tylko ze mam maly problem. jesli serwer wysle wiadomosc do jakiegos klienta, to gdy ten klient sie wylaczy, na serwerze wyskakuje blad. jesli akurat nikt nic nie napisze do tego klienta, to nie ma bledu i wszystko jest jak byc powinno. blad jest rodzaju FFFFFF (chyba to jest odwolanie do czegos nieistniejacego) ponizej zamieszczam dosc dlugi kod zrodlowy (w calosci, bo nie mam pojecia co jest nietak). a moze to sockety sie myla? (wiem ze to jest prawie niemozliwe) prosze, zeby ktos zerknal na ten kod i ewentualnie powiedzial co wg niego jest nie tak.
gomik

[code=Delphi] unit Unit1;

interface

uses
Windows, Messages, SysUt[X[XBX[7FD7G&266D66G&6FWEG&6VW34(Ń4(4(Ńng;
status: byte;
polacz[YN[YB[BB6Ć72Df&6W'fW%66śWCE6W'fW%66śWC'WGQ ŃŃ4(5źQ5ź4( ŃŃQ ŃŃ4(CoolTrayIcon1: TCoolTrayIcon;
Edit1: TEdit;
PopupM[LNY[NB[YNY[R][NBYR'WGF6Ć66VćFW#D&ŚV7B&6VGW&R6W'fW%66śWC
ąŃIĄMQ=4(MQ
Ń]M
procedure ServerSocket1ClientDisconnect(Sender: TObjecB]U[]
NBYHśWC66WB6VćFW#D&ŚV7C66śWCD7W7Fv66śWB4(
ŃĄMQ=4(utton2Click(Sender: TObject);
procedure CoolTrayIcon1ClXĘ[X
NBYH[YPXĘ[D&ŚV7B&6VGW&R6W'fW%66śWC6ĆVDW'&\"6VćFW#=4(MQ
Ń]MQent;
var ErrorCode: Integer);


private
{ P]]HX][CBXXBXXX][CVćCf f&ÓDf&ÓW6W'3'&ł#Ń4(QŃą4(ąąŃ4(ąutor:string;

implementation



{$R *.dfm}

procedurHLK]PXĘ[X
NBY[B]'CŁ7G'FBVFCFWB6W'fW'66śWC7FfSŁG'VSŚ4(4)QMM
ąŃIĄMQ=ct;
Socket: TCustomWinSocket);
begin
wiadomosc:=socket.XZ]U^BBYXY[[
XY[ĘWOI[B&VvVW#Ł7G'FB6vF62ĆVćwF4(ѹѥąąŃĄmosc)-4);
users[numer].polaczenie:=ServerSocket1.]X]PX[LNBBY[YKvF62FV&VvW6W'5śtŃŃ4(5ź1tostr(numer)+'zalogowal sie ('+socket.RemoteAddress+')');
^RXK[[
XW\"rvV&W\"rśGF7G\"VW\"rĆvvVBrĆ&DćfMŃŃĄ4(d
else
begin
serve]K]X[[Y]]JWKYNBVćCVć@ŚV6P&VvVW#Ł7GŃĄ
Ą1ŃĄ4(Ńąth(wiadomosc,length(wiadomosc)-3);
ServerSocket1.Sock]X[[YKX[YWK[^
XY[ĘNVóĆćW2FBvF7FĆVvF63rvF62rFĆŃŃŃĄ4(4(4)4(4)Q.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TU[]
NBY[BY
]]H [
FVćR7ĆŚĆvv&VvVW#ŁFVvW\"Ń4(ź1ŃŃŃĄŹe rozlaczyl');

end;
end;

procedure TForm1.ServerSoc]PX
[XB]U[]
NBvŚVóĆćW2FBtś6WGVŚR;7ŚVćRŁr66śWB&VŃ4)MMM
ŃmMMocket.ActiveConnections -1].SendText('~~~~');
Socket.Data:=B[BBYHLKPX]J[X
NBv6G&66t&ĆĆBww66ććV7B6W'fW\"rv'vŃŹąŃ%ź4(4(Ń]1Ąąion.Handle, GWL_EXSTYLE);
x:= x or WS_EX_TOOLWINDOW and noŃVTSB][ÓĘX][[KÓŃVERVó6ĆV#76vfĆR
bv3w66ććV7BEB4(IĄźźŃą4(Ń4(ĄąĄ) do
begin

Readln(F, numer, users[numer].passN][YH|[[BB[B[[CBTfĆRbVćCŚVćC&6VGW&RDf&Ó'WGF$6Ć6MQ=4)4)ź
ą4)4(4)Qrm1.CoolTrayIcon1Click(Sender: TObject);
begin
form1.CoolT^RXKÓXZ[NB[BBBYHLK[Y#6Ć66VćFW#D&ŚV7BŚ&VvŚf&Ó6Ć6SŚVćC&6QMM
ąŃĄMQ=4(Met: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCN[YNBY[BNLB[BB[ [/code][/code]
Link to comment
Share on other sites

[quote] nie jestem pewien ale mozesz sprobowac poprzez obsluge bledu:

(...) [/quote]

popatrz na kilka ostatnich linijek mojego kodu wink.gif

aha i jeszcze takie dopowiedzenie, nie wyskakuje blad socketa tylko ogolnie aplikacji (temat troche nieprecyzyjnie podalem)

Link to comment
Share on other sites

babol ktory podales to odwolanie do obiektu ktory nie istnieje. Ciezko sprawdzic bez F5 ale podejrzewam ze nadisujesz jakis obszar pamieci. Sprawdz czy przez copy nie robisz jakies smutnej rzeczy. Poszukiwalbym tez bledu przy odwolaniu sie do listy socketow moze tam sie cos wali skoro masz access violation.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link to comment
Share on other sites

nie wiem, czy to ma jakieś znaczenia, ale jak program jest kompilowany w delphi, to gdy wystapi ten blad, to linia, w której program sprawdza, czy ostatnia litera otrzymanego tekstu to tylda, jest zaznaczona na czerwono.

i jeszcze jedno. w powyzszym kodzie blokuje wszystkie bledy socketow. ale jesli zdejme ta blokade to przy kazdym odlaczeniu klienta wyskakuje taki blad:
Obrazek

Link to comment
Share on other sites

rozwiazalem problem. podejrzewam blad socketow. jesli serwer wysle do jakiegos klienta tekst, to gdy ten klient sie rozlacza (przynajmniej w moim programie tak to dziala) to nie ma zdarzenia DISCONNECT tylko serwer dostaje tekst o długości rownej 0! wystarczy dodac linie kodu sprawdzajaca dlugost otrzymanego tekstu. mam nadzieje, ze komus sie ta informacja przyda.
Link to comment
Share on other sites

ej, zaraz!
Co to znaczy, że nie ma [b]zdażenia disconnect?
Ja u siebie miałem coś takiego, że przy zamykaniu programu kienta/serwera w drugim programie pojawiał się błąd, jeżeli przed zakończeniem pierwszego nie było polecenia

(server/client)socket.active := false

Po dopisaniu tej lini w zdarzeniu OnClose formatki błędy sie skończyły.
Poza tym właśnie w zdarzeniu OnClientDisconnect wstawiłem sobie kod, informujący nie tylko, że klient się rozłączył, ale podający IP, oraz nazwę komputera, z którego dany klient się łączył.
I akurat ta część kodu działą bez zarzutu. Co nie oznacza, że nie mam problemu z innymi... ale jakoś powoli idę do celu.
Link to comment
Share on other sites

[quote] ej, zaraz!
Co to znaczy, że nie ma [b]zdażenia disconnect?
Ja u siebie miałem coś takiego, że przy zamykaniu programu kienta/serwera w drugim programie pojawiał się błąd, jeżeli przed zakończeniem pierwszego nie było polecenia

(server/client)socket.active := false

Po dopisaniu tej lini w zdarzeniu OnClose formatki błędy sie skończyły.
Poza tym właśnie w zdarzeniu OnClientDisconnect wstawiłem sobie kod, informujący nie tylko, że klient się rozłączył, ale podający IP, oraz nazwę komputera, z którego dany klient się łączył.
I akurat ta część kodu działą bez zarzutu. Co nie oznacza, że nie mam problemu z innymi... ale jakoś powoli idę do celu. [/quote]

a co sie dzieje z twoim serwerem gdy ktos zabije proces klienta :? ?
poza tym u mnie to i tak ta linijka nic nie dała, nadal ten sam blad. moze mam jakies sockety wadliwe...
Link to comment
Share on other sites

delphi:
ESocketError with message 'asynchronous socket error 10053'

serwer:
Asynchroous socket error 10053


czyli dokładnie to samo, co działo się, jak w kliencie nie było linii [code=Delphi] clientsocket.active := false; [/code]
mnie osobiście dziwi to, że Twój serwer dostaje tekst o długości 0....
może faktycznie masz sockety skopane? pobierz nowe z działu download na unit1.pl. Jeżeli ktoś nie podmienił po tym jak ja [b]z tamtądsciągnąłem, to będzie działać (zakłądając, że masz "legalne" delphi od borlanda, a nie crack, lub inne przeróbki made in home tongue.gif )


a, jeszcze jedno: czy jak pominiesz zdarzenie OnError, to też masz komunikaty o EAccesViolation?
ja nie korzystałem z socketowej obsługi błędów, więc sądzę, że to też może być przyczyną.

spróbuj pominąć zdarzenie OnError, a w kodzie klienta napisz instrukcję
nazwasocketa.Active := false; i zobacz co się stanie.

Link to comment
Share on other sites

nie, wiesz moim problemem nie jest ten komunikat asynchronous costam, ten rzeczywiscie znika po obsludze bledow lub eleganckim zakonczeniu polaczenia (poprzez polecenie active:=false) gorszy jest ten tekst o dlugosci 0, ktory blokowal calkowicie program, gdy probowalem sprawdzic, czy ta ostatnia litera z tego tekstu o dlugosci 0 jest tylda.
Link to comment
Share on other sites

Co do tekstu długości 0 - też miałem swego czasu z tym duży problem, bo wysyłałem dane i było dobrze, potem trochę zmodyfikowałem zdarzenie odbierania i nagle tekst długości 0..jaki błąd? No cóż, obadałem, że jeżeli się na ReceiveText cokolwiek robi, to on się zeruje..nie wiedzieć czemu, więc weź sobie zdefiniuj:
[delphi][/delphi]
i teraz mozesz do woli bawić się przesłanymi danymi.
Link to comment
Share on other sites

[quote] Co do tekstu długości 0 - też miałem swego czasu z tym duży problem, bo wysyłałem dane i było dobrze, potem trochę zmodyfikowałem zdarzenie odbierania i nagle tekst długości 0..jaki błąd? No cóż, obadałem, że jeżeli się na ReceiveText cokolwiek robi, to on się zeruje..nie wiedzieć czemu, więc weź sobie zdefiniuj:
[delphi][/delphi]
i teraz mozesz do woli bawić się przesłanymi danymi. [/quote]

tak, tez to zauwazylem, ze tylko raz mozna zadzialac na socket.receivetext, ale spojrz na kod - tak mam zrobione ale u mnie wcale nie ma zdarzenia disconnect tylko serwer tak naprawde dostaje tekst o dlugosci 0.
Link to comment
Share on other sites

no to sciągnij sobie nowe sockety...
http://www.unit1.pl/graphics/zalacznik.gif

ja nigdy nie miałem tego typu problemu, że serwer dostaje tekst o długości 0, a błędy [b]zdażają sie wszędzie. Niestety...


edit: hihi... potwierdzenie tego co napisałem tongue.gif niedawno przesiadłem się na firefoxa, a przy kopiowaniu linka "trochę" nie uważałem...
link do socketów jest taki http://www.unit1.pl/files/others/031122520...clsockets70.bpl

Link to comment
Share on other sites

[quote=ktoś]no to sciągnij sobie nowe sockety...
http://www.unit1.pl/graphics/zalacznik.gif

ja nigdy nie miałem tego typu problemu, że serwer dostaje tekst o długości 0, a błędy [b]zdażają

dales link do obrazka a nie do socketow laugh.gif ale akurat sie tak sklada ze mam zainstalowana dokladnie ta sama wersje. nie wiem gdzie jest problem i nie mam nawet zamiaru dociekac. wazne ze dziala

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...