How to reuse sockets in .net using beginaccept -
How to reuse sockets in .net using beginaccept -
i experimenting socket re-use on asynchronous http server writing, although code recycles .net part of socket fine, netstat shows new socket handles opened when recycled .net socket passed through beginaccept , hence server crashes under load. of import think doesn't happen under low load guess has latency of begindisconnect ?? running on mono 2.10 on ubuntu 10.04 insight grateful received. have researched quite thoroughly on google no avail.
using system; using system.io; using system.net; using system.net.sockets; using system.text; using system.collections.generic; using system.threading.tasks; using system.threading; public class server{ public static queue<socket> sockets=new queue<socket>(); public static manualresetevent alldone = new manualresetevent(false); public static void main (string [] args) { int port=81; var listensocket = new socket (addressfamily.internetwork, sockettype.stream, protocoltype.tcp); ipendpoint localendpoint = new ipendpoint (ipaddress.any, port); listensocket.bind (localendpoint); listensocket.listen (10); while (true) { console.writeline(sockets.count); try{ alldone.reset(); socket connectingsocket; if (sockets.count<100) { // populate queue reusable sockets connectingsocket=new socket (addressfamily.internetwork, sockettype.stream, protocoltype.tcp); } else { connectingsocket=sockets.dequeue(); //use existing socket queue } listensocket.beginaccept(connectingsocket,5,ar=>{ try{ socket socket=listensocket.endaccept(ar); console.writeline(connectingsocket.gethashcode()+" "+connectingsocket.connected); console.writeline(socket.gethashcode()+" "+socket.connected); socket.send(encoding.ascii.getbytes(@"http/1.1 200 ok\n\rcontent-type: text/html\n\rconnection: close\n\r\n\rhello world!!")); socket.begindisconnect(true,ar2=>{ //socket client = (socket) ar2.asyncstate; socket.enddisconnect(ar2); server.sockets.enqueue(socket); //return disconnected socket queue re-use } ,null); alldone.set(); } grab (exception e){ console.writeline("captured:"+e); } },null); alldone.waitone(); } grab (exception e){ console.writeline("captured:"+e); } } } }
.net sockets reusability
Comments
Post a Comment