public NetworkManager(Form1 app) { form = app; threadSendQueue = new ConcurrentQueue <string>(); threadRecvQueue = new ConcurrentQueue <string>(); receiver = new Thread(() => { bool error = false; while (!error) { IPAddress[] ips = Dns.GetHostEntry(Dns.GetHostName()).AddressList; IPAddress ipAddress = IPAddress.Parse(IP); IPEndPoint ep; try { ep = new IPEndPoint(IPAddress.Any, CHAT_PORT); listeningSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); listeningSocket.Bind(ep); listeningSocket.Listen(50); } catch (Exception e) { form.AppendTextBox("System: " + e.Message); listeningSocket.Close(); while (true) { try { System.Threading.SpinWait.SpinUntil(() => form.Connection); Receive(); } catch (Exception ex) { form.AppendTextBox("System: " + ex.Message); form.Connection = false; socket.Close(); break; } } continue; } //socket = listeningSocket.Accept(); //listeningSocket.Close(); System.Threading.SpinWait.SpinUntil(() => form.Connection); ip = (socket.RemoteEndPoint as IPEndPoint).Address; form.Connection = true; if (!isSenderStarted) { sender.Start(); } while (true) { try { Receive(); } catch (Exception e) { form.AppendTextBox("System: " + e.Message); form.Connection = false; socket.Close(); break; } } } }); receiver.IsBackground = true; sender = new Thread(() => { string msg; isSenderStarted = true; try { while (CheckConnection()) { System.Threading.SpinWait.SpinUntil(() => !threadSendQueue.IsEmpty); threadSendQueue.TryDequeue(out msg); socket.Send(Encoding.ASCII.GetBytes(msg), SocketFlags.None); form.AppendTextBox("Me: " + msg); } } catch (Exception ex) { form.AppendTextBox("System: " + ex.Message); } isSenderStarted = false; form.Connection = false; }); sender.IsBackground = true; receiver.Start(); }
private void Receive() { byte[] bytes = new byte[1024]; int byteCount = socket.Receive(bytes, SocketFlags.None); if (byteCount > 0) { string msg = Encoding.ASCII.GetString(bytes, 0, byteCount); if (0 == String.Compare(msg, 0, Form1.FILETRANSFER, 0, Form1.FILETRANSFER.Length)) { IPAddress ipAddress = IPAddress.Parse(IP); listeningSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Any, FILE_TRANSFER_PORT); listeningSocket.Bind(ep); listeningSocket.Listen(1); fileTransferSocket = listeningSocket.Accept(); byteCount = fileTransferSocket.Receive(bytes, SocketFlags.None); msg = Encoding.ASCII.GetString(bytes, 0, byteCount); ReceiveFile(msg, byteCount); } else if (0 == String.Compare(msg, 0, Form1.FILETRANSFER_ENCRYPTED, 0, Form1.FILETRANSFER_ENCRYPTED.Length)) { IPAddress ipAddress = IPAddress.Parse(IP); listeningSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Any, FILE_TRANSFER_PORT); listeningSocket.Bind(ep); listeningSocket.Listen(1); fileTransferSocket = listeningSocket.Accept(); byteCount = fileTransferSocket.Receive(bytes, SocketFlags.None); msg = Encoding.ASCII.GetString(bytes, 0, byteCount); ReceiveEncryptedFile(msg, byteCount); } else { threadRecvQueue.Enqueue(msg); form.AppendTextBox("Friend: " + msg); } } }