its C# code and its should help you
Code:
/*
###################################################################################################################
* ## Developers : [SCF]Leo123 & [SCF]Icarus
* ## MSN : loniao@walla.co.il
* ## email : leo1234u@gmail.com
* ## FileName : Server.cs
* ## Info : Create Connections
* ## Status : 90% Finished
* ###################################################################################################################
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Drawing;
// Local using
using eDBS.Protocol;
using eDBS.User;
using eDBS.Misc;
using eDBS.Interface;
namespace eDBS.User
{
public class Server
{
#region Varibals
private string Name;
private int m_Port;
private TcpListener m_Server;
private Thread t_Worker;
private Thread t_ServerWorker;
private string m_instanceName;
private int ClientsAlive = 0;
private bool CoreStatus = true;
public cLogTab m_Logger;
#endregion Varibals
#region Constructor
public Server(int port)
{
m_Port = port;
}
#endregion Constructor
#region Workers
// ------------------------------------------------------------------------------------------------------------------
//* Name ServerWorker , Job : Get Packets & Check if connection still alive
//* Staus : The function still dont found out if client is connected or not.
//* ------------------------------------------------------------------------------------------------------------------ */
public void ServerWorker()
{
while (CoreStatus)
{
byte[] Recv;
if (ClientsAlive > 0)
{
for (int i = 0; i != ClientsAlive; i++)
{
try
{
TcpClient Client = ServerManager.Clients[i].Connection;
Socket ClientSock = ServerManager.Clients[i].m_Socket;
if (!Client.Connected || !ClientSock.Connected)
{
ClientsAlive--;
ServerManager.ServerDel(i);
continue;
}
if (Client.Available > 0)
{
Recv = new byte[Client.Available];
int ret = ClientSock.Receive(Recv, Recv.Length, SocketFlags.None);
if (ret > 0)
{
Protocol.Protocol.ProtocolCore(i, Recv, Recv.Length);
}
}
}
catch
{
ClientsAlive--;
ServerManager.ServerDel(i);
}
}
}
Thread.Sleep(1);
}
}
// ------------------------------------------------------------------------------------------------------------------
//* Name Worker , Job : Accept Clients & add them to ServerManager
//* Staus : hmm i think finished
//* ------------------------------------------------------------------------------------------------------------------ */
public void Worker()
{
while (CoreStatus)
{
string IpAdder;
if (m_Server.Pending())
{
TcpClient uClient = m_Server.AcceptTcpClient(); // Wait to client
//uClient.ReceiveTimeout = 60000;
IpAdder = uClient.Client.LocalEndPoint.ToString();
int Free = ServerManager.SearchFree();
if (Free != -1)
{
if (ServerManager.ServerAdd(Free, IpAdder, uClient, m_Port))
{
ClientsAlive++;
}
else
{
eFU.logMain.LogOut(Color.Red, "Invaild Index?");
uClient.Close();
}
}
else
{
eFU.logMain.LogOut(Color.Red, "[Server][{0}] MAX SERVER ERROR", IpAdder);
uClient.Close();
}
}
Thread.Sleep(1);
}
}
#endregion Workers
public bool CreateServer()
{
m_Server = new TcpListener(IPAddress.Any, m_Port);
m_Server.Start();
if (m_Port >= 5500 && m_Port <= 5599)
{
eFU.logMain.LogOut(Color.DarkBlue, "[Server] DataServer{0} Start! PORT [ {1} ]", eFU.g_DataServerCount, m_Port);
}
t_Worker = new Thread(Worker);
t_Worker.Start();
t_ServerWorker = new Thread(ServerWorker);
t_ServerWorker.Start();
m_Logger.LogOut(Color.Green, "[{0}] Server Is Active on port [ {1} ]", m_instanceName, m_Port);
return true;
}
public void CreateLoginstance(string instanceName)
{
m_instanceName = instanceName;
m_Logger = new cLogTab(cLogTab.TabSave, instanceName);
m_Logger.LogInit();
}
public void DestoryServer()
{
CoreStatus = false;
t_ServerWorker.Abort();
t_Worker.Abort();
}
}
}