/// <summary> /// Send a DCC Chat request to a remote user and wait for a connection /// using timeout period specified. /// </summary> /// <remarks> /// <para>If the user does not respond within the timeout period the DccChatSession /// will stop listening for a connection. The sesssion instance created then becomes /// invalid. This methods must be called again and a new instance created in order to /// initiate a try again. /// </para> /// <para> /// This method should be called from within a try/catch block /// in case there are socket errors. /// </para> /// </remarks> /// <param name="dccUserInfo">A collection of information about the remote user.</param> /// <param name="listenIPAddress">The IP address that will be sent to the remote user. It must /// be in dotted quad format (i.e. 192.168.0.2). If the client is behind a NAT system then /// this should be the address of that system and not the local host.</param> /// <param name="listenPort">The TCP/IP port to listen on</param> /// <param name="timeout">How long to wait for a response in milliseconds. /// A value of zero will disable the timeout.</param> public static DccChatSession Request( DccUserInfo dccUserInfo, string listenIPAddress, int listenPort, long timeout ) { Debug.WriteLineIf( DccUtil.DccTrace.TraceInfo, "[" + Thread.CurrentThread.Name +"] DccChatSession::Request()"); //Create session object var session = new DccChatSession( dccUserInfo ); session._listenPort = listenPort; //Start session Thread session._thread = new Thread(new ThreadStart( session.Listen ) ); session._thread.Name = session.ToString(); session._thread.Start(); //Send Chat request to remote user session.SendChatRequest( listenIPAddress, listenPort ); //Start timeout thread if timeout > 0 if( timeout > 0 ) { var timer = new Timer( session.TimerExpired, session, timeout, 0); Debug.WriteLineIf( DccUtil.DccTrace.TraceInfo, "[" + Thread.CurrentThread.Name +"] DccChatSession::Request timeout thread started"); } return session; }
/// <summary> /// When another a remote user has sent a chat request, this /// method is called to accept the request and /// start a chat session with that user. /// </summary> /// <remarks> /// This method should be called from within a try/catch block /// because there are many things that could prevent this /// connection attempt from succeeding. /// </remarks> /// <param name="dccUserInfo">A collection of information about the remote user.</param> /// <returns>The DccChatSession instance for this session.</returns> public static DccChatSession Accept( DccUserInfo dccUserInfo ) { Debug.WriteLineIf( DccUtil.DccTrace.TraceInfo, "[" + Thread.CurrentThread.Name +"] DccChatSession::Accept()"); var session = new DccChatSession( dccUserInfo ); //Start session Thread session._thread = new Thread(session.Connect) {Name = session.ToString()}; session._thread.Start(); return session; }