Exemple #1
0
        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();
        }
Exemple #2
0
        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);
                }
            }
        }