[ igiczoran @ 22.05.2009. 17:48 ] @
Nakon inicicjalizacije socketa na serveru

Code:
   
IPHostEntry MojHostEntry = Dns.GetHostEntry(Dns.GetHostName());
IPAddress HostIP = MojHostEntry.AddressList[0];
            

IPEndPoint ipKrajnjaTackaserver = new IPEndPoint(HostIP, 10000);
serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serversocket.Bind(ipKrajnjaTackaserver);
serversocket.Listen(10);


kako server aplikacija "primeti" da je kontaktira klijent?
Tj kako bi izgledao kod u kome server socket prima podatke, npr dogadjaj OnReceive ili tako nešto?

[ Radovan__III @ 22.05.2009. 18:17 ] @
trebalo bi da bude

serversocket.Accept();
[ igiczoran @ 24.05.2009. 12:29 ] @

ali kada da pozovem Accept()? u kom događaju?
[ DarkMan @ 24.05.2009. 14:20 ] @
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