protected void Receiver() { var Listen = new TcpListener(7000); Listen.Start(); Socket ReceiveSocket; while (true) { try { ReceiveSocket = Listen.AcceptSocket(); var Receive = new Byte[256]; using (MemoryStream MessageR = new MemoryStream()) { int ReceivedBytes; do { ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); MessageR.Write(Receive, 0, ReceivedBytes); } while (ReceiveSocket.Available > 0); SendMsg("← " + Encoding.Default.GetString(MessageR.ToArray()), ChatBox); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
public void P2PListen() { int backlog = 10; ListenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try // bind 侦听 socket { ListenerSocket.Bind(ListenerEP); } catch (SocketException se) { MessageBox.Show(se.Message); return; } //开始侦听 ListenerSocket.Listen(backlog); while (true) { try { ReceiveSocket = ListenerSocket.Accept(); } catch (SocketException se) { MessageBox.Show(se.Message); } //记录IP和EP remoteEP = (IPEndPoint)ReceiveSocket.RemoteEndPoint; remoteIP = remoteEP.Address; //开始接收消息 int lentmp = ReceiveSocket.Receive(receiveByte); lenReceiveAll = 0; //把接收到的复制到receiveByteAll中 Array.Copy(receiveByte, 0, receiveByteAll, lenReceiveAll, lentmp); lenReceiveAll += lentmp; //循环,把后续所有的都收到并存在receiveByteAll中 while (lentmp > 0) { lentmp = ReceiveSocket.Receive(receiveByte); Array.Copy(receiveByte, 0, receiveByteAll, lenReceiveAll, lentmp); lenReceiveAll += lentmp; } //软停止,收到一字节的0 if (lenReceiveAll == 1) { if (receiveByteAll[0] == 0) { break; } } ReceiveSocket.Close(); newMessage = true; } ListenerSocket.Close(); }
/// <summary> /// Ожтдает отправки файла. Если файл получен уложить его в this.memorystream, /// чтобы потом утправить методом Sender /// </summary> public void Receiver(String host, int port) { try { MemoryStream mStream = new MemoryStream(); TcpListener Listen = new TcpListener(IPAddress.Parse(host), port); Listen.Start(); Socket ReceiveSocket; while (true) { ReceiveSocket = Listen.AcceptSocket(); Byte[] Receive = new Byte[256]; using (MemoryStream MessageFile = new MemoryStream()) { //Количество считанных байт Int32 ReceivedBytes; do { ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); MessageFile.Write(Receive, 0, ReceivedBytes); //Читаем до тех пор, пока в очереди не останется данных } while (ReceivedBytes == Receive.Length); MessageFile.Position = 0; MessageFile.CopyTo(this.memorystream); } break; //не принципиально, но тогда можно явно закончить поток // и отобразить на форме } } catch (Exception ex) { MessageBox.Show(ex.Message, "Connected failed", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
// Приём файла private void recieveThread_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; TcpListener Listener = new TcpListener(5678); string filename; Listener.Start(); Socket ReceiveSocket; int progress = 0; while (send_allow) { try { ReceiveSocket = Listener.AcceptSocket(); System.Windows.Forms.SaveFileDialog savedial = new SaveFileDialog(); //if (System.Windows.Forms.DialogResult.OK == savedial.ShowDialog()) // { filename = "C:/test.txt";//savedial.FileName; //} Byte[] Receive = new Byte[256]; //using (MemoryStream MessageR = new MemoryStream()) { //Количество считанных байт Int32 ReceivedBytes; Int32 Firest256Bytes = 0; String FilePath = ""; Int64 filesize = 0; Int64 all_size = -1; FileStream fl = null; String resFilePath = ""; Stopwatch stopWatch = new Stopwatch(); Stopwatch stopWatch2 = new Stopwatch(); string speed = "0"; int speed_last = 0; int count = 0; do {//Собственно читаем if (count == 0) { stopWatch.Restart(); } ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); all_size += ReceivedBytes; //Разбираем первые 256 байт if (Firest256Bytes < 256) { Firest256Bytes += ReceivedBytes; Byte[] ToStr = Receive; all_size -= 256; //Накапливаем имя файла FilePath += Encoding.Default.GetString(ToStr); resFilePath = FilePath.Substring(0, FilePath.IndexOf('\0')); fl = new FileStream(resFilePath, FileMode.Create); } else if (Firest256Bytes < 512) { all_size -= 256; Firest256Bytes += ReceivedBytes; Byte[] ToStr = Receive; string str_size = ""; str_size += Encoding.Default.GetString(ToStr); String res_size = str_size.Substring(0, str_size.IndexOf('\0')); filesize = Convert.ToInt64(res_size); all_size = 0; file_desc f = new file_desc(resFilePath, filesize); byte[] mess = new byte[1]; if (!AcessFileSafe(f)) { toLogSafe(login + " | Приём файла " + resFilePath + " | Передача отклонена"); mess[0] = 0; ReceiveSocket.Send(mess); return; } else { mess[0] = 1; ReceiveSocket.Send(mess); stopWatch.Start(); stopWatch2.Start(); } } else { count++; if (count == 100) { TimeSpan ts = stopWatch.Elapsed; int progres = (int)(all_size / (filesize / 100)); int speed_cur = Convert.ToInt32((25600 * 1000 / 1024) / ts.TotalMilliseconds); TimeSpan ts2 = stopWatch2.Elapsed; if (ts2.Seconds > 1) { stopWatch2.Restart(); speed = Convert.ToString(speed_cur); speed_last = speed_cur; } recieveThread.ReportProgress(progres, speed); count = 0; } //и записываем в поток fl.Write(Receive, 0, ReceivedBytes); } //Читаем до тех пор, пока в очереди не останется данных } while (all_size != filesize && !sendThread.CancellationPending); if (recieveThread.CancellationPending) { ReceiveSocket.Close(); recieveThread.ReportProgress(0, "0"); toLogSafe(login + " | Приём файла " + resFilePath + " | Передача отменена"); } else { ReceiveSocket.Close(); toLogSafe(login + " | Приём файла " + resFilePath + " | завершен от " + another_login); } } } catch (System.Exception er) { toLogSafe("Ошибка : " + er.Message); } } }
private void FileRecive() { //Создаем Listener на порт "по умолчанию" TcpListener Listen = new TcpListener(1572); //Начинаем прослушку Listen.Start(); //и заведем заранее сокет Socket ReceiveSocket; while (true) { try { string name; //Пришло сообщение ReceiveSocket = Listen.AcceptSocket(); Byte[] Receive = new Byte[256]; //Читать сообщение будем в поток using (MemoryStream MessageR = new MemoryStream()) { //Количество считанных байт Int32 ReceivedBytes; Int32 Firest256Bytes = 0; String FilePath = ""; do {//Собственно читаем ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); //Разбираем первые 256 байт if (Firest256Bytes < 256) { Firest256Bytes += ReceivedBytes; Byte[] ToStr = Receive; //Учтем, что может возникнуть ситуация, когда они не могу передаться "сразу" все if (Firest256Bytes > 256) { Int32 Start = Firest256Bytes - ReceivedBytes; Int32 CountToGet = 256 - Start; Firest256Bytes = 256; //В случае если было принято >256 байт (двумя сообщениями к примеру) //Остаток (до 256) записываем в "путь файла" ToStr = Receive.Take(CountToGet).ToArray(); //А остальную часть - в будующий файл Receive = Receive.Skip(CountToGet).ToArray(); MessageR.Write(Receive, 0, ReceivedBytes); } //Накапливаем имя файла FilePath += Encoding.Default.GetString(ToStr); } else { //и записываем в поток MessageR.Write(Receive, 0, ReceivedBytes); } //Читаем до тех пор, пока в очереди не останется данных } while (ReceivedBytes == Receive.Length); //Убираем лишние байты String resFilePath = FilePath.Substring(0, FilePath.IndexOf('\0')); MessageBox.Show(resFilePath); using (var File = new FileStream(resFilePath, FileMode.Create)) {//Записываем в файл File.Write(MessageR.ToArray(), 0, MessageR.ToArray().Length); }//Уведомим пользователя //ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Получено: " + resFilePath, ChatBox }); name = resFilePath; } } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } }
// public static string Mesajcurrent = "Idle"; protected void FileReceiver() { string name; name = textBox1.Text; //Создаем Listener на порт "по умолчанию" TcpListener Listen = new TcpListener(6999); Listen.Stop(); //Начинаем прослушку Listen.Start(); //и заведем заранее сокет Socket ReceiveSocket; while (true) { try { //Пришло сообщение ReceiveSocket = Listen.AcceptSocket(); Byte[] Receive = new Byte[1024]; //Читать сообщение в поток using (MemoryStream MessageR = new MemoryStream()) { //Количество считанных байт Int32 ReceivedBytes; Int32 Firest1024Bytes = 0; String FilePath = ""; do {// читаем ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); //Разбираем первые 1024 байт if (Firest1024Bytes < 1024) { Firest1024Bytes += ReceivedBytes; Byte[] ToStr = Receive; //проверка на то что не всегда они передаются сразу if (Firest1024Bytes > 1024) { Int32 Start = Firest1024Bytes - ReceivedBytes; Int32 CountToGet = 1024 - Start; Firest1024Bytes = 1024; //В случае если было принято >1024 байт (двумя сообщениями к примеру) //Остаток (до 1024) записываем в "путь файла" ToStr = Receive.Take(CountToGet).ToArray(); //А остальную часть - в будующий файл Receive = Receive.Skip(CountToGet).ToArray(); MessageR.Write(Receive, 0, ReceivedBytes); } //Накапливаем имя файла FilePath += Encoding.Default.GetString(ToStr); } else { //и записываем в поток MessageR.Write(Receive, 0, ReceivedBytes); } //Читаем до тех пор, пока в очереди не останется данных } while (ReceivedBytes == Receive.Length); //Убираем лишние байты String resFilePath = FilePath.Substring(0, FilePath.IndexOf('\0')); using (var File = new FileStream(resFilePath, FileMode.Create)) {//Записываем в файл File.Write(MessageR.ToArray(), 0, MessageR.ToArray().Length); } SendMessage("\n " + name + ":" + "Файл отправляется" + ";;;5"); } } catch (System.Exception ex) { MessageBox.Show(ex.Message); } SendMessage("\n " + name + ":" + "Файл отправлен" + ";;;5"); } }