public void AddSocket(ISocket socket) { SocketElement instance = Instantiate(socketPrefab); instance.transform.SetParent(transform); instance.Initialize(socket); }
private void CloseClientSocket(SocketAsyncEventArgs e) { SocketElement se = e.UserToken as SocketElement; try { se.Socket.Shutdown(SocketShutdown.Send); } catch (Exception) { } Interlocked.Decrement(ref connCount); SemaphoreAcceptedClients.Release(); Clients.Push(e); }
public SocketAsyncEventArgs Pop(SocketElement UserToken) { SocketAsyncEventArgs arg; lock (freePool) { arg = freePool.Pop(); } arg.UserToken = UserToken; lock (busyPool) { busyPool.Add(UserToken.UID, arg); } return(arg); }
public void Push(SocketAsyncEventArgs arg) { SocketElement se = (SocketElement)arg.UserToken; lock (busyPool) { if (busyPool.ContainsKey(se.UID)) { busyPool.Remove(se.UID); } } lock (freePool) { freePool.Push(arg); } }
private void ProcessAccept(SocketAsyncEventArgs e) { if (e.LastOperation != SocketAsyncOperation.Accept) { return; } if (e.BytesTransferred <= 0) { return; } //不允许同Ip多个连接 if (Clients.CheckIpOnLine((e.AcceptSocket.RemoteEndPoint as IPEndPoint).Address.ToString())) { return; } SocketElement se = new SocketElement("", e.AcceptSocket); SetUserToken?.Invoke(null, se);// if (Clients.ContainsUID(se.UID)) { SocketException?.Invoke(new Exception("用户id已存在!")); return; } SocketAsyncEventArgs arg = Clients.Pop(se); ((SocketElement)arg.UserToken).Socket = e.AcceptSocket; Interlocked.Increment(ref connCount); bool willRaiseEvent = e.AcceptSocket.ReceiveAsync(arg); if (!willRaiseEvent) { ProcessReceive(arg); } StartAccept(e); }
public UserTokenEventArgs(SocketElement u) { User = u; }