private void Download() { Debug.WriteLineIf(DccUtil.DccTrace.TraceInfo, "[" + Thread.CurrentThread.Name + "] DccFileSession::Download()" + (turboMode? " Turbo": " Legacy") + " mode"); try { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(dccUserInfo.RemoteEndPoint); int bytesRead = 0; while (!dccFileInfo.AllBytesTransfered()) { bytesRead = socket.Receive(buffer); //Remote server closed the connection before all bytes were sent if (bytesRead == 0) { Interrupted(); return; } ResetActivityTimer(); AddBytesProcessed(bytesRead); dccFileInfo.TransferStream.Write(buffer, 0, bytesRead); //Send ack if in legacy mode if (!turboMode) { socket.Send(DccUtil.DccBytesReceivedFormat(dccFileInfo.CurrentFilePosition())); } } dccFileInfo.TransferStream.Flush(); Finished(); } catch (Exception e) { Debug.WriteLineIf(Rfc2812Util.IrcTrace.TraceWarning, "[" + Thread.CurrentThread.Name + "] DccFileSession::Download() exception=" + e); if (e.Message.IndexOf("refused") > 0) { dccUserInfo.Connection.Listener.Error(ReplyCode.DccConnectionRefused, "Connection refused by remote user."); } else { dccUserInfo.Connection.Listener.Error(ReplyCode.ConnectionFailed, "Unknown socket error:" + e.Message); } Interrupted(); } }