<div dir="ltr"><div>I found a leak in TcpListener.AcceptTcpClient :</div><div><br></div><div><div><div>public TcpClient AcceptTcpClient ()</div><div>{</div><div><span class="" style="white-space:pre">              </span>if (!active)</div>

<div><span class="" style="white-space:pre">                            </span>throw new InvalidOperationException ("Socket is not listening");</div><div><br></div><div><span class="" style="white-space:pre">                </span>Socket clientSocket = server.Accept ();</div>

<div><br></div><div><span class="" style="white-space:pre">           </span>TcpClient client = new TcpClient();  // this call creates a socket even though we don't need it</div><div><span class="" style="white-space:pre">                </span>// use internal method SetTcpClient to make a</div>

<div><span class="" style="white-space:pre">            </span>// client with the specified socket</div><div><span class="" style="white-space:pre">                </span>client.SetTcpClient (clientSocket);  // This method leaks the socket created by the default constructor.</div>

<div><br></div><div><span class="" style="white-space:pre">           </span>return client;</div><div>}</div></div></div><div><br></div><div><br></div><div>The method calls the default TcpClient constructor which creates a new socket.  SetTcpClient is then called to assign the accepted socket to the TcpClient object.  The problem is that the SetTcpClient simply replaces the old socket reference by the new without closing the old socket.  The result is that the socket created by the default constructor remains until the GC reclaims it.</div>

<div><br></div><div>The fix would be really easy.  Instead of calling the default TcpClient constructor, a new constructor could be created taking the socket as parameter.  We would then avoid creating and leaking a socket every time the method is called.  The fixed method would look like this :</div>

<div><br></div><div><div>public TcpClient AcceptTcpClient ()</div><div>{</div><div><span class="" style="white-space:pre">              </span>if (!active)</div><div><span class="" style="white-space:pre">                               </span>throw new InvalidOperationException ("Socket is not listening");</div>

<div><br></div><div><span class="" style="white-space:pre">           </span>Socket clientSocket = server.Accept ();</div><div><br></div><div><span class="" style="white-space:pre">           </span>TcpClient client = new TcpClient(clientSocket);</div>

<div><br></div><div><span class="" style="white-space:pre">           </span>return client;</div><div>}</div></div><div><br></div><div><br></div><div>I could create a fix with the proposed solution.  Any thoughts?</div><br clear="all">

<br></div>