gomik Posted March 3, 2006 Report Share Posted March 3, 2006 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 More sharing options...
Marek Posted March 3, 2006 Report Share Posted March 3, 2006 nie jestem pewien ale mozesz sprobowac poprzez obsluge bledu: [delphi][/delphi] Link to comment Share on other sites More sharing options...
gomik Posted March 3, 2006 Author Report Share Posted March 3, 2006 [quote] nie jestem pewien ale mozesz sprobowac poprzez obsluge bledu: (...) [/quote]popatrz na kilka ostatnich linijek mojego kodu aha i jeszcze takie dopowiedzenie, nie wyskakuje blad socketa tylko ogolnie aplikacji (temat troche nieprecyzyjnie podalem) Link to comment Share on other sites More sharing options...
ktoś Posted March 3, 2006 Report Share Posted March 3, 2006 wrzuć screena z komunikatem błędu. Link to comment Share on other sites More sharing options...
gomik Posted March 3, 2006 Author Report Share Posted March 3, 2006 taki blad wyskakuje jak program kompiluje w delphi:a taki jak uruchomie EXE: Link to comment Share on other sites More sharing options...
Toster Posted March 4, 2006 Report Share Posted March 4, 2006 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 /> Link to comment Share on other sites More sharing options...
gomik Posted March 5, 2006 Author Report Share Posted March 5, 2006 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: Link to comment Share on other sites More sharing options...
gomik Posted March 5, 2006 Author Report Share Posted March 5, 2006 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 More sharing options...
ktoś Posted March 5, 2006 Report Share Posted March 5, 2006 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 More sharing options...
gomik Posted March 5, 2006 Author Report Share Posted March 5, 2006 [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 More sharing options...
ktoś Posted March 5, 2006 Report Share Posted March 5, 2006 delphi:ESocketError with message 'asynchronous socket error 10053'serwer:Asynchroous socket error 10053czyli 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 )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 More sharing options...
gomik Posted March 6, 2006 Author Report Share Posted March 6, 2006 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 More sharing options...
Iskar Posted March 6, 2006 Report Share Posted March 6, 2006 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 More sharing options...
gomik Posted March 6, 2006 Author Report Share Posted March 6, 2006 [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 More sharing options...
ktoś Posted March 6, 2006 Report Share Posted March 6, 2006 no to sciągnij sobie nowe sockety... http://www.unit1.pl/graphics/zalacznik.gifja 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 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 More sharing options...
sazian Posted March 6, 2006 Report Share Posted March 6, 2006 [quote] no to sciągnij sobie nowe sockety...http://www.unit1.pl/graphics/zalacznik.gif [/quote]ładny obrazek Link to comment Share on other sites More sharing options...
gomik Posted March 6, 2006 Author Report Share Posted March 6, 2006 [quote=ktoś]no to sciągnij sobie nowe sockety... http://www.unit1.pl/graphics/zalacznik.gifja 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 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.