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);
}
}
}