Socket UDP

venerdì 30 gennaio 2004 - 18.21

vale Profilo | Newbie

Ciao a tutti,
vi espongo il mio problema:
vorrei testare la qualità del collegamento radio tra un client ed un server inviando un certo numero di pacchetti UDP in modo continuo tra i due(ossia uno che trasmette solamente ed uno che riceve solamente)e vedendo il rapporto tra quelli inviati e quelli persi.In particolare ho scritto un programma in cui lancio dapprima il server che si mette in ascolto su un certo porto e poi il client che,dopo essere stato riconosciuto dal server gli "spara" 5120 pacchetti UDP di 1024 Bytes dove ciascuno dei 1024 Bytes all'interno del pacchetto è costituito da un numero casuale(per evitere di inviare pacchetti tutti uguali).


Il problema è che,essendo la connessione non affidabile(UDP) se uno dei 5120 pacchetti inviati dal client viene perso,essendo il metodo

numbytes=sock_serv.ReceiveFrom(pacchetto,ref client);

presente all'interno del Server di tipo bloccante,quando un pacchetto viene perso il server si rimane in attesa fermando il contatore all'ultimo spacchetto corretto ricevuto mentre il client continua ad inviarli.
Secondo voi come potrei fare per costringere il server a "fregarsene" del pacchetto perso e continuare la ricezione degli altri seguenti(forse un evento )?
Grazie

Brainkiller Profilo | Guru

Ciao,
come ben saprai ci sono due tipi di Socket, sincroni e asincroni. Il sincrono è una specie di botta e risposta, probabilmnete come lo stai usando tu. Cioè invii e poi ricevi e resti in attesa, se non arrivano più pacchetti lui resta sempre in attesa, si chiama appunto blocking-call visto che resta fermo ad aspettare, inoltre se non hai dedicato un thread alla receive l'applicazione sembra bloccata :)
Il modo asincrono invece è appunto il contrario, cioè tu invii dei pacchetti e/o li ricevi, ma è un evento tramite un delegate che scatta quando arrivano dei pacchetti, quindi la chiamata è "non blocking".
I due tipi di socket vengono usati in scenari diversi per esempio un client di posta potrebbe usare il socket sincrono perchè la sequenza dei comandi inviati e ricevuti è conosciuta ed è ordinata, diverso invece il caso di un server per la chat per esempio in cui un messaggio di un utente può arrivare in qualunque momento quindi l'applicazione server non può restare bloccata.

Non ho ancora visto il tuo codice ma se usi la classe UdpClient i metodi sono sincroni, quindi ti conviene usare la più generale Socket e creare dei socket appunto per UDP e usare le funzioni BeginReceive, BeginSend, EndReceive, EndSend sul Framework è abb. documentato.

ciao
david

val Profilo | Newbie

Grazie tante ho fatto come dicevi tu ed ora funziona..
ora vorrei passare all'interfaccia grafica in modo da poter settare i parametri del collegamento tramite form.Qualche idrea?

Brainkiller Profilo | Guru

In che senso, che problema hai?
ciao

david

val Profilo | Newbie

Mi spiego..
vorrei poter settare ad es.l'intervallo temporale tra l'invio di 2 pacchetti consecutivi da una form..il problema è che essendo nuovo alla programmazione Windows(Form) non ho ancora idea di come poter pessare tramite form i parametri ai metodi,far partire client/server premendo un pulsante e cose del genere..
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5