Sledeci kod je je dosta grub, bez obrada greska, cisto da ti ukaze kako bi otprilike izgledalo:
Code:
byte[] buffer = new byte[4096];
public void Listen()
{
...
socketListener.Listen(backlog);
socketListener.BeginAccept(new AsyncCallback(OnClientConnect), socketListener);
}
private void OnClientConnect(IAsyncResult async)
{
Socket socketListener = async.AsyncState as Socket;
Socket socket = socketListener.EndAccept(async);
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), socket);
socketListener.BeginAccept(new AsyncCallback(OnClientConnect), socketListener);
}
private void OnDataReceived(IAsyncResult async)
{
Socket socket = async.AsyncState as Socket;
int received = socket.EndReceive(async);
if(received > 0) {
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), socket);
}
}
Zadnji parametar metoda
BeginAccept i
BeginReceive je korisnicki podatak koji se prenosi u te asinhrone metode koje ce biti pozvane a u tim metoda se dobija preko
IAsyncResult.AsyncState parametra. Moj predlog je da sve sto ti treba za konekciju i prenos podataka stavis u neki tvoj objekat i onda taj objekat stavis kao parametar ovih metoda. Evo ti i primer:
Code:
public class MojiPodaci
{
public Socket socketListener = null;
public Socket clientSocket = null;
public byte[] buffer = new byte[4096];
public int received = 0;
}
public void Listen()
{
...
MojiPodaci podaci = new MojiPodaci();
socketListener.BeginAccept(new AsyncCallback(OnClientConnect), podaci);
}
private void OnClientConnect(IAsyncResult async)
{
MojiPodaci podaci = async.AsyncState as MojiPodaci;
podaci.clientSocket = podaci.socketListener.EndAccept(async);
...
}
Nadam se da si me razumeo. Ovo sto sam ti naveo je asinhrona komunikacija.
Za detalje je ipak bolje da pogledas neki kod na netu, kao na primer ovo:
http://www.codeguru.com/csharp...work/sockets/article.php/c7695