Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] TROVATO FINALMENTE AUHHUAAHU
Forum - C# / VB.NET - [VB.NET] TROVATO FINALMENTE AUHHUAAHU

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 9:34
Mercoledì, 24/06/2009
Questo topic è stato chiuso dal moderatore

raga l'ho trovatoooooooooo vi ricordate che vi ho rotto i bigoli pe run mese per quel mio programma server che saliva spropositamente di memoria? bene ho capito dove sta l'errore... il problema è che non so come risolverlo...
nel file allegato vi ho semplificato il progetto e se lo aprite occhio al task che succhia 150 mb di ram in una 15ina di secondi. certo il processo è velocizzato a ciclo while ma è per farvi vedere come succhia ram... il problema è proprio la procedura BeginAccept()
guardate guardate e vi rendete conto... cosa posso fare per fare in modo che non si mangi la ram in quel modo?? grazie!!!


GoLDBeRG ha allegato un file: ConsoleApplication2.zip (63198 bytes)
Clicca qui per scaricare il file
PM
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 13:30
Mercoledì, 24/06/2009
Il problema è che tu esegui tante BeginAccept unadi seguito all'altra, e il sistema non può rilasciare le risorse. Nella funzione accetta(callback) inserisci EndAccept.
Così però non risolvi il problema: devi far in modo che BeginAccept venga chiamato solo una volta prima di EndAccept, solo dopo che EndAccept viene chiamato puoi chiamamre di nuovo BeginAccept.


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:40
Mercoledì, 24/06/2009
Sinceramente secondo me in questo caso usare BeginAccept è una forzatura...poichè il metodo non blocca il while, quindi quello continua a "ciclare" all'infinito e crea miliardi di thread! Ti consiglio invece di fare così:
Prima di tutto il metodo "accetta" dichiaralo così:
Codice sorgente - presumibilmente VB.NET

  1. Public Sub accetta(ByVal s As Socket)
  2.     End Sub


Dopodichè il metodo "parti" scrivilo così:
Codice sorgente - presumibilmente VB.NET

  1. Public Sub parti()
  2.         Try
  3.             clientgen.Bind(New IPEndPoint(IPAddress.Parse("0.0.0.0"), port))
  4.             clientgen.Listen(2000)
  5.             Console.WriteLine("Start To Listen on port: " & port)
  6.             While True
  7.                 Evento.Reset()
  8.                 Dim thr As New Thread(AddressOf accetta)
  9.                 thr.Start(clientgen.Accept)
  10.             End While
  11.             clientgen.Close()
  12.             Evento.Close()
  13.         Catch
  14.             Console.WriteLine("Failed Listen on port: " & port)
  15.         End Try
  16.     End Sub


Fatto ciò, il while avanza soltanto quando un client si connette! Quindi non si generano miliardi di thread :)

P.S. Il metodo "circola" è inutile dirti che l'ho eliminato! :D

PM
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 16:20
Mercoledì, 24/06/2009
Codice sorgente - presumibilmente VB.NET

  1. Imports System
  2. Imports System.Net.Sockets
  3. Imports System.Net
  4. Imports System.Text
  5. Imports System.Threading
  6.  
  7. Public Class Connect
  8.  
  9.     '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  10.     '               NO ERORRI RAM
  11.     '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12.  
  13.     Public port As UInteger
  14.     Public clientgen As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
  15.     Public evento As New ManualResetEvent(False)
  16.     Public p As New AsyncCallback(AddressOf accetta)
  17.  
  18.     Public Function bannaipbassolivello(ByVal ip As String, ByRef client As Socket) As Boolean
  19.         If Module1.impostazioni.arraysyn.Contains(ip) Then
  20.             Dim c As New Firewall
  21.             c.ip = ip
  22.             client.Close()
  23.             If Module1.impostazioni.sottoattacco Then
  24.                 c.manda = False
  25.             End If
  26.             c.banna()
  27.             Module1.protocol.connessionirifiutate += 1
  28.             Return True
  29.         Else
  30.             Module1.impostazioni.arraysyn.Add(ip)
  31.         End If
  32.         Return False
  33.     End Function
  34.  
  35.     Public Sub bannasub(ByVal ip As String, ByRef chi As Socket)
  36.         Dim c As New Firewall
  37.         c.ip = ip
  38.         chi.Close()
  39.         If Module1.impostazioni.sottoattacco Then
  40.             c.manda = False
  41.         End If
  42.         c.banna()
  43.         Module1.protocol.connessionirifiutate += 1
  44.     End Sub
  45.  
  46.     Public Sub accetta(ByVal ar As IAsyncResult)
  47.         evento.Set()
  48.         Dim us As New User
  49.         Try
  50.             us.time.Enabled = True
  51.             us.client = CType(ar.AsyncState, Socket).EndAccept(ar)
  52.             us.ip = CType(us.client.RemoteEndPoint, IPEndPoint).Address.ToString
  53.             If (us.client.Available - 5) Mod 7 <> 0 And us.client.Available <> 0 Then
  54.                 Module1.impostazioni.accettaint += 1
  55.                 If Module1.impostazioni.arrayset(28) = False Then GoTo nulla
  56.                 If Module1.impostazioni.accettaint > Module1.protezione.spoofing Then
  57.                     If Module1.impostazioni.sottoattacco = False Then
  58.                         Module1.impostazioni.sottoattacco = True
  59.                         Dim b As New Spoofing
  60.                         b.connessioni = Module1.protocol.connessionirifiutate
  61.                         b.porta = port
  62.                         Dim thr As New Thread(AddressOf b.parti)
  63.                         thr.Start()
  64.                     End If
  65.                 End If
  66.                 bannasub(us.ip, us.client)
  67. nulla:
  68.                 Exit Sub
  69.             Else
  70.                 If Module1.impostazioni.arrayset(29) Then
  71.                     If bannaipbassolivello(us.ip, us.client) Then
  72.                         Exit Sub
  73.                     End If
  74.                 End If
  75.  
  76.                 If Module1.impostazioni.banip Then
  77.                     If Module1.controllasebannato(us.ip, us) Then
  78.                         Module1.mandabot("Your IP Is Banned", us)
  79.                         Module1.protocol.connessionirifiutate += 1
  80.                         Module1.disconnettiuser(us)
  81.                         Exit Sub
  82.                     End If
  83.                 End If
  84.  
  85.                 If Module1.impostazioni.arrayset(3) Then
  86.                     If Module1.impostazioni.arrayprotected.Contains(us.ip) = False Then
  87.                         Dim conto As UInteger
  88.                         For Each asd As User In Module1.impostazioni.users
  89.                             If asd.ip = us.ip Then
  90.                                 conto += 1
  91.                             End If
  92.                         Next
  93.                         If conto > Module1.protezione.ip Then
  94.                             Module1.mandabot("Il tuo IP è gia Presente in HUB", us)
  95.                             Module1.altrobanip(us.ip)
  96.                             Module1.mandaopchat("L'ip: " & us.ip & " è stato bannato, Double IP Control", us)
  97.                             Module1.protocol.connessionirifiutate += 1
  98.                             Module1.disconnettiuser(us)
  99.                             Exit Sub
  100.                         End If
  101.                     End If
  102.                 End If
  103.  
  104.                 If Module1.impostazioni.arrayset(12) Then
  105.                     If Module1.impostazioni.arraysocks.Contains(us.ip) Then
  106.                         Module1.mandabot("Non è Permesso l'uso dei Socks", us)
  107.                         Module1.altrobanip(us.ip)
  108.                         Module1.mandaopchat("L'ip: " & us.ip & " è stato bannato, Socks", us)
  109.                         Module1.protocol.connessionirifiutate += 1
  110.                         Module1.disconnettiuser(us)
  111.                         Exit Sub
  112.                     End If
  113.                 End If
  114.  
  115.                 Module1.protocol.connessioniaccettate += 1
  116.  
  117.                 send(us, "$Lock EXTENDEDPROTOCOL::This_hub_was_written_by_TeNeBrA::CTRL[NoKey] Pk=Colossus|")
  118.                 send(us, "$Supports NoHello NoGetINFO UserIP2 BotINFO Feed MCTo|")
  119.  
  120.                 us.client.BeginReceive(us.ReadBuffer, 0, us.ReadBuffer.Length, SocketFlags.None, New AsyncCallback(AddressOf ricevi), us)
  121.             End If
  122.         Catch
  123.             Module1.protocol.connessionirifiutate += 1
  124.             Module1.disconnettiuser(us)
  125.         End Try
  126.     End Sub
  127.  
  128.     Public Sub ricevi(ByVal ar As IAsyncResult)
  129.         Dim us As User = CType(ar.AsyncState, User)
  130.         Try
  131.             us.temp &= Encoding.Default.GetString(us.ReadBuffer, 0, us.ReadBuffer.Length)
  132.             us.temp = us.temp.Replace(Chr(0), "")
  133.             If us.temp.Length = 0 Then
  134.                 disconnettiuser(us)
  135.                 Exit Sub
  136.             End If
  137.             If us.temp(0) = "|" Then
  138.                 disconnettiuser(us)
  139.                 Exit Sub
  140.             End If
  141.             Array.Clear(us.ReadBuffer, 0, us.ReadBuffer.Length)
  142.             If us.temp.Contains("$MyNick") And us.nick = "" Then
  143.                 Module1.protocol.connessionirifiutate += 1
  144.                 Module1.protocol.connessioniaccettate -= 1
  145.                 Module1.disconnettiuser(us)
  146.                 Module1.impostazioni.accettaint += 1
  147.                 bannasub(us.ip, us.client)
  148.                 Exit Sub
  149.             End If
  150.  
  151.             annanz(us)
  152.  
  153.             Thread.Sleep(10)
  154.  
  155.             us.client.BeginReceive(us.ReadBuffer, 0, us.ReadBuffer.Length, SocketFlags.None, New AsyncCallback(AddressOf ricevi), us)
  156.  
  157.         Catch
  158.             disconnettiuser(us)
  159.         End Try
  160.     End Sub
  161.  
  162.     Public Sub annanz(ByRef us As User)
  163.         If us.temp.Length > 5000 Then
  164.             Module1.disconnettiuser(us)
  165.             Exit Sub
  166.         End If
  167.         If us.temp.EndsWith("|") Then
  168.             Module1.impostazioni.bandaricevuta += us.temp.Length
  169.             Module1.protocol.bytericevuti += us.temp.Length
  170.             Module1.dataarrival(us, us.temp)
  171.             us.temp = ""
  172.         End If
  173.     End Sub
  174.  
  175.     Public Sub parti()
  176.         Try
  177.             clientgen.Bind(New IPEndPoint(IPAddress.Parse(Module1.impostazioni.ipparse), port))
  178.             clientgen.Listen(Module1.impostazioni.nmrsockets)
  179.             Dim thr As New Thread(AddressOf circola)
  180.             thr.Start()
  181.             Console.WriteLine("Start To Listen on port: " & port)
  182.         Catch
  183.             Console.WriteLine("Failed Listen on port: " & port)
  184.         End Try
  185.     End Sub
  186.  
  187.     Public Sub circola()
  188.         While (Module1.impostazioni.avviato)
  189.             evento.Reset()
  190.             Try
  191.                 If ce() = False Then
  192.                     Exit While
  193.                 End If
  194.                 clientgen.BeginAccept(p, clientgen)
  195.                 evento.WaitOne()
  196.             Catch
  197.             End Try
  198.         End While
  199.         evento.Close()
  200.         clientgen.Close()
  201.     End Sub
  202.  
  203.     Public Function ce() As Boolean
  204.         If Not Module1.impostazioni.avviato Then Return False
  205.         For Each asd As String In Module1.impostazioni.arrayporte
  206.             If asd = port Then
  207.                 Return True
  208.             End If
  209.         Next
  210.         Return False
  211.     End Function
  212. End Class



questo è il codice originale... basiamoci su questo...
il ragazzo che dice che il begin accept crea tantissimi thread e quindi la ram satura potrebbe essere vero.... ma anche in questo modo usando l'evento manualraiseevent che blocca il while finche non arriva una richiesta di connessione la ram sale lo stesso!!! molto piu lentamente ma sale....vedete qualcosa che posso ottimizzare?

PM
Avatar
fabriziorocca (Normal User)
Guru


Messaggi: 1162
Iscritto: 22/03/2009

Segnala al moderatore
Postato alle 16:38
Mercoledì, 24/06/2009
Diavolo che pesante ! Da me dopo 25 secondi mi ha già succhiato 2GB di RAM !!!


PM
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 16:46
Mercoledì, 24/06/2009
ho fatto una prova malefica e ho notato il particolare.....

us.client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, chiamata, Nothing)

  us.client.Send(buffer, buffer.Length, SocketFlags.None)


la differenza tra queste 2 procedure apparte che una è sincrona e l'altra asincrona è che quella asincrona prende un macello di ram e una volta che ha finito nemmeno libera piu quella ram... è la stessa cosa del begin accept....

quindi la domanda è spontanea... perche il beginaccept e il beginsend prendono cosi tanta ram? volendo.... cosa posso usare come alternativa in modo da restare sempre in ambito asincrono?

Ultima modifica effettuata da GoLDBeRG il 24/06/2009 alle 16:46
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:28
Mercoledì, 24/06/2009
Asincronamente parlando :rotfl: dubito che esistano altri modi di procedere che non occupino la ram! Io ti consiglio vivamente di provare ad usare solo i metodi sincroni (dopotutto mica sono così brutti xD), perchè sui metodi asincroni ci ho già sbattuto la testa tempo fa quando ho provato a creare una comunicazione client-server multithreaded e sinceramente non ho cavato un ragno dal buco :D la ram la squartano letteralmente

PM
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 17:42
Mercoledì, 24/06/2009
non me ne parlare... sai cosè che i metodi sincroni devo scartarli a priori.... ti faccio capire meglio....

ho un array client fatto cosi

client1
client2
client3
client4
client5
client6

for each asd as socket in client         //qui il messaggio viene mandato molto
asd.beginsend(ciao)                      //velocemente ma occupa molta ram
next

oppure

for each asd as socket in client          
asd.send(ciao)
next

//in questo invece il tempo che passa tra l'invio del messaggio al client1 e al client6 è eterno.. dato che il send nn prosegue finche non è sicuro che il send precedente sia andato a buon fine... e io non ho 4 client nell'array... me 800-900...

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:01
Mercoledì, 24/06/2009
Ho avuto un lampo di genio! :D ho ripreso il tuo allegato iniziale e l'ho modificato secondo ciò che mi è venuto in mente:
Codice sorgente - presumibilmente VB.NET

  1. Imports System
  2. Imports System.Net.Sockets
  3. Imports System.Net
  4. Imports System.Text
  5. Imports System.Threading
  6.  
  7. Public Class ClassConnect
  8.  
  9.     '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  10.     '               NO ERORRI RAM
  11.     '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12.  
  13.     Public port As UInteger
  14.     Public clientgen As TcpListener
  15.     Public Evento As New ManualResetEvent(False)
  16.     Dim p As New AsyncCallback(AddressOf accetta)
  17.  
  18.     Public Sub accetta(ByVal ar As IAsyncResult)
  19.        
  20.     End Sub
  21.  
  22.     Public Sub parti()
  23.         Try
  24.             clientgen = New TcpListener(New IPEndPoint(IPAddress.Parse("0.0.0.0"), port))
  25.             clientgen.Start()
  26.             Dim thr As New Thread(AddressOf circola)
  27.             thr.Start()
  28.             Console.WriteLine("Start To Listen on port: " & port)
  29.         Catch
  30.             Console.WriteLine("Failed Listen on port: " & port)
  31.         End Try
  32.     End Sub
  33.  
  34.     Public Sub circola()
  35.         On Error Resume Next
  36.         While (True)
  37.             Evento.Reset()
  38.             If clientgen.Pending Then clientgen.BeginAcceptSocket(p, clientgen)
  39.             'Evento.WaitOne()
  40.         End While
  41.         clientgen.Stop()
  42.         Evento.Close()
  43.     End Sub
  44. End Class


In pratica se usi TcpListener al posto di Socket, hai a disposizione la comoda funzione Pending che ti permette di sapere se ci sono connessioni da accettare! Inoltre se per caso Socket ha un metodo che TcpListener non possiede, puoi sempre ottenere il Socket associato tramite TcpListener.Server! Dimmi che ho risolto i tuoi problemi :rotfl:

P.S. Dimenticavo di dirti che comunque quel While infinito occupa totalmente la CPU :)

Ultima modifica effettuata da il 24/06/2009 alle 18:03
PM
Pagine: [ 1 2 3 ] Precedente | Prossimo