/// <summary>
        /// Called when a Socket has been established as a result of a
        /// BeginAcceptSocket call.
        /// </summary>
        private void SocketAccepted(IAsyncResult ar)
        {
            Socket s = tcpListener.EndAcceptSocket(ar);
            var    internalPayload        = (Tuple <StringSocketCallback, object>)ar.AsyncState;
            StringSocketCallback callback = internalPayload.Item1;
            StringSocket         ss       = new StringSocket(s, encoding);
            object externalPayload        = internalPayload.Item2;

            callback(ss, externalPayload);
        }
 /// <summary>
 /// Begins listening asynchonously for an incoming socket reqest.  When a
 /// StringSocket is established, invokes the callback with the StringSocket
 /// and the payload as parameters.
 /// </summary>
 public void BeginAcceptStringSocket(StringSocketCallback callback, object payload)
 {
     tcpListener.BeginAcceptSocket(SocketAccepted, new Tuple <StringSocketCallback, object>(callback, payload));
 }