Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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 - Pagina 2

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


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 18:04
Mercoledì, 24/06/2009
si potrebbe essere una soluzione... ma il problema resta... visto dove ho scritto del send e beginsend? ecco se risolvi quella ti bacio i piedi XD

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:07
Mercoledì, 24/06/2009
Testo quotato

Postato originariamente da GoLDBeRG:

si potrebbe essere una soluzione... ma il problema resta... visto dove ho scritto del send e beginsend? ecco se risolvi quella ti bacio i piedi XD


Cioè? Dopo questa mia affermazione, non capisco qual è il problema...sto ancora pensando al lampo di genio xD

Ah si scusa ho letto ora :D comunque la soluzione potrebbe essere questa (ho creato un nuovo modulo perchè mi stavo incasinando :rotfl: ):
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Net.Sockets
  2. Imports System.Threading
  3. Module Module1
  4.     Dim client As Socket()
  5.     Sub comunica(ByVal s As Socket)
  6.         s.Send("Ciao")
  7.     End Sub
  8.     Sub Main()
  9.         For Each asd As Socket In client
  10.             Dim t As New Thread(AddressOf comunica)
  11.             t.Priority = ThreadPriority.Lowest
  12.             t.Start(asd)
  13.         Next
  14.     End Sub
  15. End Module


Così non si blocca ad ogni invio ma soprattutto credo che non usi tanta ram :)

Ultima modifica effettuata da il 24/06/2009 alle 18:19
PM
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 19:50
Mercoledì, 24/06/2009
mi spiace rovinare ancor ail tuo lampo di genio pero' nemmeno questo va bene... ci ho gia pensato... e ... io ho bisogno di inviare anche centinaia di messaggi al secondo verso 500-600 client... imamgina se creassi un thread ogni volta che devo mandare un messaggio a tutti i client... si creerebbero centinaia di thread bloccando il pc... maledizione >.< ci deve pure essere una soluzione da qualche parte!!! stupido visual basic

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 19:54
Mercoledì, 24/06/2009
Testo quotato

Postato originariamente da GoLDBeRG:

mi spiace rovinare ancor ail tuo lampo di genio pero' nemmeno questo va bene... ci ho gia pensato... e ... io ho bisogno di inviare anche centinaia di messaggi al secondo verso 500-600 client... imamgina se creassi un thread ogni volta che devo mandare un messaggio a tutti i client... si creerebbero centinaia di thread bloccando il pc... maledizione >.< ci deve pure essere una soluzione da qualche parte!!! stupido visual basic


...e se provassi a creare un thread per ogni client? :)

PM
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 20:18
Mercoledì, 24/06/2009
800 thread? uhm... in teoria un buon pc potrebbe anche supportarli... pero' questo nn risolve il problema del messaggio globale... il send lento e laggoso o il begin send dispendioso di ram e veloce? ma possibile non ce un intermezzo... non puo essere sbagliamo qualcosa....

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:47
Mercoledì, 24/06/2009
Testo quotato

Postato originariamente da GoLDBeRG:

800 thread? uhm... in teoria un buon pc potrebbe anche supportarli... pero' questo nn risolve il problema del messaggio globale... il send lento e laggoso o il begin send dispendioso di ram e veloce? ma possibile non ce un intermezzo... non puo essere sbagliamo qualcosa....


Essere o non essere, questo è il problema! S'egli sia più nobile soffrire nell'animo le frombole e i dardi dell'oltraggiosa fortuna, o prender armi contro un mare di guai
e contrastandoli por fine ad essi? xDxD
Beh la risposta è semplice! C'è una parola il cui significato sta a metà fra sincrono ed asincrono? No, perciò altri metodi non ce ne sono, a meno che non scrivi un tuo metodo di invio sfruttando il NetworkStream del Socket! :D ma dubito che in VB.Net si possa fare (anche perchè la Microsoft ha implementato il NetworkStream solo nel TcpClient) :)

Mi correggo! Puoi ottenere il NetworkStream del Socket così:
Codice sorgente - presumibilmente VB.NET

  1. Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
  2.         Dim ns As New NetworkStream(s, IO.FileAccess.ReadWrite, True)


Se vuoi provare a creare il tuo metodo, buon lavoro! Se hai bisogno di aiuto chiedi pure :D

Ultima modifica effettuata da il 24/06/2009 alle 20:53
PM
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

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

  1. Public Sub manda(ByRef us As User, ByVal data As String)
  2.         Try
  3.             data = data.Replace(Chr(10) & Chr(10), "").Replace("||", "")
  4.             If data.EndsWith("|") = False Then
  5.                 data &= "|"
  6.             End If
  7.             impostazioni.banda += data.Length
  8.             protocol.byteinviati += data.Length
  9.             Dim buffer() As Byte = Encoding.Default.GetBytes(data)
  10.             'us.client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, chiamata, Nothing)
  11.             Dim p As New NetworkStream(us.client)
  12.             p.BeginWrite(buffer, 0, buffer.Length, chiamata, Nothing)
  13.             p.Flush()
  14.         Catch
  15.         End Try
  16.     End Sub



ecco la maledetta procedura che occupa ram!!! l'ho trovata finalmente...e piu precisamente...

Codice sorgente - presumibilmente Plain Text

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



allroa io pensando di essere piu intelligente ho provato a fare il giochino del networkstream... e usando... p.BeginWrite... indovina cosa succede.... sale di ram -.- mentre usando il write non sale -.- proprio come il send e beginsend... sto iniziando a pensare che la microsoft mi stia prendendo per il culo

e se avessi impostato male qualcosa nel socket? un timeout? un ttl? qualcosa? potrebbe essere?

Ultima modifica effettuata da GoLDBeRG il 24/06/2009 alle 21:20
PM
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 22:24
Mercoledì, 24/06/2009
ahuahuauhahuauhuahh lo sapevoooooooooo la microsoft non è stupida!!!!!! lo sapevo che aveva qualcosa in serbo per i suoi vecchi errori!!!!!

leggi qui!!!


Jason Clark

MSDN Magazine July 2003
...

Read more!
    
Rete
Connettiti con .NET Framework 3.5
Mariya Atanasova and Larry Cleeton and Mike Flasko and Amit Paka

In questo articolo verranno discussi i seguenti argomenti:

    * Prestazioni della classe Socket
    * URL internazionalizzati
    * Spazio dei nomi System.Net.PeerToPeer

    In questo articolo verranno utilizzate le seguenti tecnologie:
.NET Framework
Sommario
Prestazioni della classe Socket
Supporto degli IRI (International Resource Identifier)
Spazio dei nomi System.Net.PeerToPeer
Conclusioni
In Microsoft ® .NET Framework lo spazio dei nomi System.Net espone le funzionalità di molti protocolli di rete, quali HTTP e SMTP. La nuova versione 3.5 di .NET Framework (che verrà fornita con Visual Studio® 2008, precedentemente noto con il nome in codice di "Orcas") contiene numerosi miglioramenti funzionali e prestazionali per questi importanti livelli di rete. In quest'articolo verranno prese in esame tre modifiche principali apportate dal team System.Net:

    * L'API Socket ad alte prestazioni
    * Il supporto degli IRI (International Resource Identifier) per gli URI (Uniform Resource Identifier)
    * Lo spazio dei nomi peer-to-peer (P2P)

Con la nuova versione 3.5 di .NET Framework verranno introdotte modifiche al framework stesso. Le funzionalità descritte in questo articolo sono disponibili nella versione Beta 1 di Visual Studio 2008, scaricabile da MSDN®.

Prestazioni della classe Socket
Nella versione 2.0 di .NET Framework, lo spazio dei nomi System.Net.Sockets fornisce una classe Socket che offre pressoché tutte le funzionalità delle API Win32® di Windows®. Queste funzionalità vengono messe a disposizione tramite una classe con metodi e proprietà progettate per gli sviluppatori di codice gestito. In Socket è inclusa un serie di metodi sincroni, fra cui Send e Receive, con l'aggiunta di numerosi parametri utilizzabili in varie situazioni. Questi metodi sincroni sono facili da utilizzare e sono particolarmente adatti a semplici attività di rete che prevedono l'utilizzo di socket. In Socket è inoltre disponibile una serie di metodi asincroni basati sul modello di programmazione asincrono (Asynchronous Programming Model, APM) prevalente in tutto .NET Framework (per ulteriori informazioni, vedere msdn.microsoft.com/msdnmag/issues/07/03/ConcurrentAffairs). Questi metodi asincroni semplificano relativamente l'utilizzo asincrono della classe Socket e consentono di gestire un numero elevato di socket o molte operazioni di invio e ricezione su un numero elevato di socket.
La classe Socket inclusa nella versione 2.0 è adatta a un'ampia gamma di applicazioni client aventi la necessità di utilizzare socket di rete, oltre che per alcune applicazioni server e di servizio. Purtroppo in alcuni scenari di applicazioni di servizio non è possibile utilizzare la classe Socket inclusa nella versione 2.0. È comunque possibile ovviare a questi casi ricorrendo ai linguaggi nativi che utilizzano direttamente le API WinSock di Windows. Il problema principale della classe Socket della versione 2.0 è costituito dall'utilizzo di un numero eccessivo di cicli della CPU per eseguire una singola operazione di I/O su socket e quando vengono allocati gli oggetti sottostanti necessari per mantenere le operazioni di I/O su un gran numero di socket contemporaneamente.
Utilizzando Common Language Runtime (CLR) incluso in .NET Framework 3.5 è ora possibile gestire contemporaneamente un elevato numero di oggetti Overlapped in maniera più efficiente. Gli oggetti Overlapped in CLR eseguono efficacemente il wrapping della struttura OVERLAPPED nativa di Windows utilizzata per gestire le operazioni di I/O asincrone. Esiste una istanza dell'oggetto Overlapped per ogni operazione di I/O asincrona di Socket in corso. Inoltre è ora possibile disporre di oltre 60.000 socket connessi, mantenendo nel contempo un'operazione di I/O di ricezione asincrona in attesa su ogni socket.
La classe Socket inclusa nella versione 2.0 utilizza le porte di completamento di I/O di Windows per il completamento di operazioni di I/O asincrone. Ciò consente alle applicazioni di essere facilmente scalabili su un gran numero di socket aperti. Con .NET Framework viene implementata la classe System.Threading.ThreadPool, la quale fornisce i thread di completamento che leggono le porte di completamento e completano le operazioni di I/O asincrone. Durante lo sviluppo della nuova versione 3.5 di .NET Framework, ci siamo impegnati a fondo per eliminare l'overhead nei percorsi di codice fra la lettura di una porta di completamento e la chiamata al delegato di completamento di un'applicazione o la segnalazione dell'oggetto evento di completamento dell'I/O in un oggetto IAsyncResult.
Il modello APM di .NET Framework è definito anche modello Begin/End perché, per iniziare un'operazione asincrona, viene chiamato un metodo Begin e viene restituito un oggetto IAsyncResult. Se lo si desidera, è possibile fornire come parametro al metodo Begin un delegato, che verrà chiamato una volta completata l'operazione asincrona, altrimenti un thread può restare in attesa su IAsyncResult.AsyncWaitHandle. Quando viene eseguita la richiamata o viene segnalata l'attesa, viene chiamato il metodo End per ottenere i risultati dell'operazione asincrona. Questo modello è flessibile, relativamente semplice da utilizzare e comune in tutto .NET Framework.
È importante osservare, tuttavia, che esiste un prezzo da pagare nel caso si esegua un numero significativo di operazioni di socket asincrone. È necessario creare un oggetto IAsyncResult per ogni operazione e gli oggetti non possono essere riutilizzati. Ciò può influire pesantemente sulle prestazioni, sovraccaricando l'allocazione degli oggetti e la garbage collection. Come soluzione alternativa per questo problema, nella nuova versione è incluso un modello di metodi per eseguire l'I/O asincrono con i socket. Questo nuovo modello non richiede l'allocazione di un oggetto di contesto dell'operazione per ogni operazione socket.
Anziché creare un modello interamente nuovo, ne abbiamo utilizzato uno esistente, apportandogli una modifica fondamentale. Nella classe Socket sono ora disponibili metodi che utilizzano una variante del modello di completamento basato sugli eventi. Per iniziare un invio asincrono su un socket, nella versione 2.0 si utilizzerebbe il codice seguente:

void OnSendCompletion(IAsyncResult ar) { }

IAsyncResult ar = socket.BeginSend(buffer, 0, buffer.Length,
    SocketFlags.None, OnSendCompletion, state);

Sempre nella nuova versione, è possibile, in alternativa, procedere come descritto di seguito:

void OnSendCompletion(object src, SocketAsyncEventArgs sae) { }

SocketAsyncEventArgs sae = new SocketAsyncEventArgs();
sae.Completed += OnSendCompletion;
sae.SetBuffer(buffer, 0, buffer.Length);
socket.SendAsync(sae);

Qui vi sono alcune differenze sensibili. L'oggetto che esegue il wrapping del contesto dell'operazione è un oggetto SocketAsyncEventArgs anziché IAsyncResult. L'applicazione crea e gestisce (e può addirittura riutilizzare) oggetti SocketAsyncEventArgs. Tutti i parametri per l'operazione socket sono specificati dalle proprietà e dai metodi dell'oggetto SocketAsyncEventArgs e anche lo stato di completamento è fornito dalle proprietà dell'oggetto SocketAsyncEventArgs, infine è necessario l'utilizzo di un metodo di completamento per la richiamata del gestore eventi.
Tutte queste modifiche hanno come effetto un notevole miglioramento delle prestazioni e della scalabilità della classe System.Net.Sockets di .NET Framework 3.5. Due di questi miglioramenti saranno conseguiti automaticamente dalle applicazioni esistenti, mentre il terzo, ovvero i nuovi metodi Socket, potrà essere utilizzato soltanto modificando un'applicazione, sebbene questi metodi forniscano maggiore scalabilità per le applicazioni basate su socket più complesse.

riassuntino...

beginsend fa schifo quindi hanno implementato il sendsyn che usa gli eventi invece di creare l'oggetto asynresult auhauhah ecco perche sale di ram sto cretinoooo!!!

PM
Pagine: [ 1 2 3 ] Precedente | Prossimo