void CreateContextPool(int maxNumberOfConnnections) { int recvSize = 1024 * 2; int sendSize = 1024 * 2; _bufferMan = new BufferManager((recvSize + sendSize) * maxNumberOfConnnections, (recvSize + sendSize)); //Allocate memory for buffers. We are using a separate buffer space for //receive and send, instead of sharing the buffer space, like the Microsoft //example does. _contextPool = new SharedResoucePool <HttpsContext>(maxNumberOfConnnections); //------------------------------------------------------------------ //It is NOT mandatory that you preallocate them or reuse them. But, but it is //done this way to illustrate how the API can // easily be used to create ***reusable*** objects to increase server performance. //------------------------------------------------------------------ //connection session: socket async = 1:1 for (int i = maxNumberOfConnnections - 1; i >= 0; --i) { var context = new HttpsContext(this, recvSize, sendSize); context.CreatedFromPool = true; context.BindReqHandler(_reqHandler); //client handler _contextPool.Push(context); } }
internal bool CheckWebSocketUpgradeRequest(HttpsContext httpConn) { if (WebSocketServer == null) { return(false); } HttpRequest httpReq = httpConn.HttpReq; HttpResponse httpResp = httpConn.HttpResp; string upgradeKey = httpReq.GetHeaderKey("Upgrade"); if (upgradeKey != null && upgradeKey == "websocket") { //1. websocket request come here first //2. web server can design what web socket server will handle this request, based on httpCon url string sec_websocket_key = httpReq.GetHeaderKey("Sec-WebSocket-Key"); string sec_websocket_extensions = httpReq.GetHeaderKey("Sec-WebSocket-Extensions"); Internal2.AbstractAsyncNetworkStream baseStream = httpConn.BaseStream; #if DEBUG baseStream.BeginWebsocketMode = true; #endif //backup data before unbind socket string webSocketInitPath = httpReq.Path; //-------------------- httpConn.UnBindSocket(false); //unbind but not close client socket //-------------------- WebSocketServer.RegisterNewWebSocket(baseStream, webSocketInitPath, sec_websocket_key, sec_websocket_extensions); //the bind client to websocket server return(true); } return(false); }
public void Start() { if (_isRunning) { return; } //------------------------------ try { //------------------------------ int maxNumberOfConnections = 500; int excessSaeaObjectsInPool = 200; int backlog = 100; int maxSimultaneousAcceptOps = 100; var setting = new NewConnListenerSettings(maxNumberOfConnections, excessSaeaObjectsInPool, backlog, maxSimultaneousAcceptOps, new IPEndPoint(_localOnly ? IPAddress.Loopback : IPAddress.Any, _port));//check only local host or not CreateContextPool(maxNumberOfConnections); _newConnListener = new NewConnectionListener(setting, clientSocket => { //when accept new client int recvSize = 1024 * 2; int sendSize = 1024 * 2; HttpsContext context = new HttpsContext(this, recvSize, sendSize); context.BindReqHandler(_reqHandler); //client handler #if DEBUG context.dbugForHttps = true; #endif context.BindSocket(clientSocket); //*** bind to client socket //for ssl -> cert must not be null context.StartReceive(_serverCert); //TODO:: //USE https context from Pool???? //{ // HttpsContext context = _contextPool.Pop(); // context.BindSocket(clientSocket); //*** bind to client socket // context.StartReceive(UseSsl ? _serverCert : null); //} }); //------------------------------ //start web server _isRunning = true; _newConnListener.StartListening(); } catch (Exception ex) { } }
internal void ReleaseChildConn(HttpsContext httpContext) { if (httpContext != null) { httpContext.Reset(); if (httpContext.CreatedFromPool) { _contextPool.Push(httpContext); } _newConnListener.NotifyFreeAcceptQuota(); } }