Этот обработчик сокетов действительно обрабатывает на многопоточном уровне? - PullRequest
1 голос
/ 24 января 2012

У нас есть производственное приложение, которое должно быть многопоточным слушателем сокетов.Я начинаю сомневаться, потому что журналы, которые генерирует приложение, заставляют его выглядеть так, как будто он обрабатывает потоки, которые он получает синхронно.Чтобы не вставлять здесь стенку кода, я предоставлю первую часть предположительно асинхронного tcp-кода: это правильная практика?

        /// <summary>
        /// Start an Asynchronous Socket to listen for connections. 
        /// </summary>
        public static void StartListening()
        {
            Socket listenerSocket = null;

            try
            {
                var ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
                var ipAddress = ipHostInfo.AddressList[Socket.OSSupportsIPv6 ? 1 : 0];

                //Create TCP/IP Socket
                listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                listenerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
                listenerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1);

                //Bind the socket to the local endpoint and listen for incoming connections.
                //listenerSocket.Bind(new IPEndPoint(ipAddress, m_client.RemotePort));
                listenerSocket.Bind(new IPEndPoint(ipAddress, Int32.Parse(ConfigurationManager.AppSettings["ListenerPort"])));
                listenerSocket.Listen(m_maxSocketConnections);

                while (true)
                {
                    //Set the event to nonsignaled state
                    m_pAllDone.Reset();

                    //Start an asynchronous socket 
                    listenerSocket.BeginAccept(new AsyncCallback(AcceptCallback), listenerSocket);

                    //Wait until a connection is made and processed before continuing
                    m_pAllDone.WaitOne();
                }
            } 

Ответы [ 2 ]

1 голос
/ 24 января 2012

Этот вызов не многопоточный, он просто асинхронный.Начиная с документа :

When your application calls BeginAccept, the system usually uses a separate thread to execute the specified callback method and blocks on EndAccept until a pending connection is retrieved.

Метод BeginAccept создает еще один поток, который блокирует и обрабатывает входящие пакеты асинхронно.Он не создает новую ветку каждый раз, когда приходит сообщение.

0 голосов
/ 24 января 2012

Socket.BeginAccept - это , задокументированное как «Начинает асинхронную операцию для принятия попытки входящего соединения.», Поэтому эта часть операции (принятие запроса на подключение к сокету) является асинхронной.Это не значит, что то, что вы делаете в AcceptCallback, гарантированно является многопоточным - есть множество способов сделать это синхронными или даже однопоточными, даже с асинхронными сокетами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...