void AcceptCallBack(IAsyncResult ar)
{
Socket s = (Socket)ar.AsyncState;
if(s==null)
{
return;
}
Socket workSocket = s.EndAccept(ar);
if(workSocket==null||stoped)
{
return;
}
allDone.Set();
IPEndPoint remoteHost = workSocket.RemoteEndPoint as IPEndPoint;
string serverIP = remoteHost.Address.ToString();
onAccecpt(serverIP);
//首先取flag標誌
if(workSocket==null||stoped)
{
return;
}
if(workSocket.Poll(-1,SelectMode.SelectRead))
{
StateObject o = new StateObject();
o.queue.Clear();
o.workSocket = workSocket;
int port = remoteHost.Port;
serverIP = remoteHost.Address.ToString()+ ": "+port;
workSocket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallBack),o);
}
}
#endregion
Thread messageThread;
#region 接受消息
void ReceiveCallBack(IAsyncResult ar)
{
receiveDone.Reset();
StateObject o = ar.AsyncState as StateObject;
Socket workSocket = o.workSocket;
this.workSocket =workSocket;
IPEndPoint remoteHost = workSocket.RemoteEndPoint as IPEndPoint;
int port = remoteHost.Port;
string serverIP = remoteHost.Address.ToString()+ ": "+port;
if(workSocket==null||stoped)
{
return;
}
int pos = workSocket.EndReceive(ar);
if(pos> 0)
{
for(int i=0;i <pos;i++)
{
o.queue.Enqueue(buffer[i]);
}
if(pos==bufferSize)
{
workSocket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallBack),o);
}
else
{
//讀取結束
//得到接受到全部數據流
if(o.queue.Count> 0)
{
ProcessData processData = new ProcessData();
processData.MessageQueue = MessageHelper.GetMessages(o.queue);
processData.ip=serverIP;
processData.stateObject=o;
MessageQueue.Enqueue(processData);
if(messageThread==null)
{
messageThread = new Thread(new ThreadStart(Process));
messageThread.IsBackground=true;
messageThread.Start();
}
}
o.queue.Clear();
if(workSocket.Poll(-1,SelectMode.SelectRead))
{
workSocket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallBack),o);
}
}
}
}
#endregion