コード例 #1
0
        public static void UDPThread(WorkersPortNumberConstruct p_workers_port_number_construct, object p_worker_producer_pulse_object, int p_check_data
                                     , IPEndPoint p_server_udp_ip_endpoint, IPAddress p_server_ipd_address)
        {
            Socket udp_socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
            int    k          = 0;

            while (k < 4)
            {
                try
                {
                    udp_socket.Bind(p_server_udp_ip_endpoint);
                    k = 0;
                    break;
                }
                catch (SocketException)
                {
                    k++;
                    continue;
                }
            }
            if (k > 3)
            {
                Console.WriteLine("Error in binding udp ipenpoint");
                try
                {
                    Environment.Exit(1);
                }
                catch
                {
                }
                Thread.CurrentThread.Abort();
                return;
            }

            byte[] buffer = new byte[32];
            int    h      = 0;
            int    l      = 0;

            List <int> socket_stoping_app_errors = GetAppKillingErrorsCodes();

            while (true)
            {
                EndPoint client_endpoint = (EndPoint)p_server_udp_ip_endpoint;
                try
                {
                    buffer = new byte[32];
                    udp_socket.ReceiveFrom(buffer, ref client_endpoint);
                    int received_int = BitConverter.ToInt32(buffer, 0);
                    if (p_check_data != received_int)
                    {
                        h = 0;
                        l = 0;
                        continue;
                    }
                    l = 0;
                    h = 0;
                }
                catch (SocketException exception)
                {
                    int socket_exception_error_code = exception.ErrorCode;
                    if (socket_stoping_app_errors.Contains(socket_exception_error_code))
                    {
                        h++;
                        Console.WriteLine("network error with code:" + exception.ErrorCode.ToString() + "\n" + exception.Message);
                        Thread.Sleep(50);
                        if (h > 5)
                        {
                            Console.WriteLine("Too Much Socket Error Occured. Killing Application");
                            try
                            {
                                Environment.Exit(2);
                            }
                            catch
                            {
                            }
                            Thread.CurrentThread.Abort();
                            return;
                        }
                    }
                    else
                    {
                        h = 0;
                    }
                }
                catch (System.Security.SecurityException exception)
                {
                    Console.WriteLine("Security Error: " + exception.Message);
                    l++;
                    if (l > 5)
                    {
                        Console.WriteLine("Too Much Security Error Occured. Killing Application. Restart Program");
                        try
                        {
                            Environment.Exit(1);
                        }
                        catch
                        {
                        }
                        Thread.CurrentThread.Abort();
                        return;
                    }
                }
                catch (Exception)
                {
                    continue;
                }

                int g           = 0;
                int random_port = 0;
                while (g < 4)
                {
                    try
                    {
                        TcpListener temp_listener = new TcpListener(p_server_ipd_address, 0);
                        temp_listener.Start();
                        random_port = ((IPEndPoint)temp_listener.LocalEndpoint).Port;
                        temp_listener.Stop();
                        g = 0;
                        break;
                    }
                    catch
                    {
                        g++;
                        continue;
                    }
                }
                if (g > 3)
                {
                    Console.WriteLine("Error in all0cating tcp port to client. please restart the application.");
                    try
                    {
                        Environment.Exit(4);
                    }
                    catch
                    {
                    }
                    Thread.CurrentThread.Abort();
                    return;
                }

                try
                {
                    udp_socket.SendTo(BitConverter.GetBytes(random_port), client_endpoint);
                }
                catch (SocketException exception)
                {
                    continue;
                }
                lock (p_worker_producer_pulse_object)
                {
                    p_workers_port_number_construct.workers_port_number_queue.Enqueue(random_port);
                    p_workers_port_number_construct.workers_port_number_queue_flag = true;
                    Monitor.Pulse(p_worker_producer_pulse_object);
                }
            }
        }
コード例 #2
0
        public static void WorkerProducerThread(Dictionary <int, KeyValuePair <Thread, ServerWorkerData> > p_all_workers_data, object p_all_workers_data_lock
                                                , object p_producer_pulse_object, ReceiveFromServerWorkerConstruct p_receive_from_worker_construct, WorkersPortNumberConstruct p_workers_port_number_construct
                                                , object p_server_pulse_object, IPAddress p_server_ip_address)
        {
            while (true)
            {
                lock (p_producer_pulse_object)
                {
                    if (!p_workers_port_number_construct.workers_port_number_queue_flag)
                    {
                        Monitor.Wait(p_producer_pulse_object);
                    }

                    if (p_workers_port_number_construct.workers_port_number_queue_flag)
                    {
                        if (p_workers_port_number_construct.workers_port_number_queue.Count > 0)
                        {
                            int port_num = p_workers_port_number_construct.workers_port_number_queue.Dequeue();
                            if (p_workers_port_number_construct.workers_port_number_queue.Count == 0)
                            {
                                p_workers_port_number_construct.workers_port_number_queue_flag = false;
                            }
                            ServerWorkerData new_worker_data = new ServerWorkerData(p_receive_from_worker_construct, p_server_pulse_object, new RemoveWorker(p_all_workers_data.Remove));
                            int    new_thread_id             = HelperFunctions.GetGUID();
                            Thread new_worker_thread         = new Thread(() => WorkerThread.WorkerMainThread(new_worker_data, port_num, new_thread_id, p_all_workers_data_lock, p_server_ip_address));
                            lock (p_all_workers_data_lock)
                            {
                                p_all_workers_data.Add(new_thread_id, new KeyValuePair <Thread, ServerWorkerData>(new_worker_thread, new_worker_data));
                            }
                            new_worker_thread.Start();
                        }
                        else
                        {
                            p_workers_port_number_construct.workers_port_number_queue_flag = false;
                        }
                    }
                }
            }
        }