Tcp/Ip e eventi il tutto condito con c sharp...

lunedì 20 ottobre 2008 - 16.41

VicVonDoom Profilo | Newbie

Ma possibile che non riesco a trovare nulla di semplice e funzionante?.....tutti bravissimi a fare chat, ftp et simile, ma un esempio semplice, nulla...
allora ho un programmino (client) che deve mandare una stringa ad un servizio NT (su un server con altro ip) il quale fa altri lavori, quindi se riceve la mia stringa (in un evento!) vorrei mi rimandasse altra stringa di risposta. Le domande sono:
Come apro una connessione in tcp-ip?
Come mando una banale stringa di testo da client a server?
Come può il server, con un evento (Importante!) ricevere la stringa e in che modo mando la risposta?
E infine come il client riceve la stringa (evento!)?

aiuto.....
"Chuck Norris può bere tutta l'acqua di un rubinetto"

aiedail92 Profilo | Expert

Ciao

Per inviare dati attraverso la rete devi usare la classe Socket che trovi nel namespace System.Net.Sockets. Lato client devi creare un socket che si colleghi all'indirizzo del server e inviare i dati, poi aspetti che il server invii la risposta. Lato server invece attendi connessioni sull'indirizzo locale, quando la risposta arriva elabori i dati e rimandi indietro il risultato con lo stesso socket della connessione (mentre l'applicazione client è in attesa di dati)

Eccoti un esempio col codice:

//Lato server: //Attende connessioni in ingresso void WaitConnections() { //Crea il socket Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Binding del socket all'indirizzo locale - necessario per Listen //Devi specificare una porta sock.Bind(new IPEndPoint(IPAddress.Any, 800)); //Attende connessioni in ingresso sock.Listen(-1); //Quando arriva accetta la connessione in ingresso e ottiene il //socket della connessione Socket connSock = sock.Accept(); //Il buffer di ricezione dei dati //(modifica a tua scelta la dimensione massima del buffer, //oppure adattalo per ingrandire il buffer quando necessario) byte[] recvBuf = new byte[100]; //Riceve i dati e ottiene il numero di byte letti int byteCount = connSock.Receive(recvBuf); //Converte i byte in stringa string str = Encoding.UTF8.GetString(recvBuf, 0, byteCount); //Elabora la stringa str = str.ToUpper(); //Invia indietro i dati sullo stesso socket, dove //il client sta attendendo la risposta byte[] res = Encoding.UTF8.GetBytes(str); connSock.Send(res); //Chiude i socket delle connessioni sock.Close(); connSock.Close(); } //Lato client: //Comunica col server void Communicate() { //Crea un socket per la comunicazione Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Connette il socket al server (indirizzo e porta) IPAddress addr = new IPAddress(new byte[] { 94,36,132,152 }); sock.Connect(addr, 800); //I dati della stringa da inviare byte[] data = Encoding.UTF8.GetBytes("Stringa"); //Invia i dati sock.Send(data); //Il buffer per ricevere la risposta byte[] res = new byte[100]; //Riceve la risposta del server int byteCount = sock.Receive(res); //Converte la risposta in stringa string str = Encoding.UTF8.GetString(res, 0, byteCount); this.label1.Text = str; //Chiude la connessione col socket sock.Close(); }

Se devi proprio usare degli eventi, quello che puoi fare è mettere il socket in attesa su un thread a parte ed invocare l'evento dopo che il socket ha accettato una richiesta (quindi dopo Accept())

Luca

VicVonDoom Profilo | Newbie

Mumble, molto interessante, non ci avevo pensato, mò provo e poi ti dico, grazie!

Fatto! Perfetto!! Grazie mille!!

aiedail92 Profilo | Expert

Di niente

Luca
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5