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