protected void InitializeServer(int nPort) { tcpLsn = new TcpListener(nPort); tcpLsn.Start(); tcpThd = new Thread(new ThreadStart(WaitingForClient)); tcpThd.Start(); } public void WaitingForClient() { ClientData CData; while(true) { /* Accept will block until someone connects */ CData.structSocket = tcpLsn.AcceptSocket(); Interlocked.Increment(ref connectId); CData.structThread = new Thread(new ThreadStart(ReadSocket)); lock(this) { // it is used to keep connected Sockets and active thread dataHolder.Add(connectId, CData); } CData.structThread.Start(); } } public void ReadSocket() { /* realId will be not changed for each thread, but connectId is * changed. it can't be used to delete object from Hashtable*/ long realId = connectId; Byte[] receive; ClientData cd = (ClientData)dataHolder[realId]; Socket s = cd.structSocket; int ret = 0; string sData = null; string[] sReceived; bool bExit = false; // Exit on Success while (!bExit) { if(s.Connected) { receive = new Byte[100] ; try { ret = s.Receive(receive,receive.Length,0); // Do stuff with received data AND send back a response int sentBytes = s.Send(Encoding.UTF8.GetBytes(sData),Encoding.UTF8.GetBytes(sData).Length,SocketFlags.None); } catch (Exception e) { if( !s.Connected ) { break; } else cwp.mobile.utils.DisplayError(e); } bExit = true; } } CloseTheThread(realId); } private void CloseTheThread(long realId) { try { ClientData clientData = (ClientData)dataHolder[realId]; clientData.structThread.Abort(); } catch(Exception ) { lock(this) { dataHolder.Remove(realId); } } }