несколько вызовов BeginAccept для сокета
От: ZeBbra  
Дата: 15.03.10 08:37
Оценка:
Пытаюсь написать простенький асинхронный сервер.
Прочитал http://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx , Асинхронный вариант.

Суть в том, что на серверном сокете в примере делается 10 вызовов BeginAccept.

Я только потом заметил, что при первом коннекте клиента в таком случае загрузка процессора сразу ходит вверх. И секунда 10 порядка 60-80% мы имеем на процессе Myserver.vshost.exe.
На слабых машинах (300мгц) это может затянуться на минуты.

Собственно дело не в 10 BeginAccept. Если вызывать для сокета BeginAccept больше раза (хотя бы два), то именно при первом коннекте на сервер мы будем иметь загрузку сильную ЦП, потом такого не повторяется.
Можно ли делать несколько BeginAccept?? Может я что то упустил...

Клинет просто коннектится и уходит в слиип, на с++:
nError = WSAConnect(socket,(struct sockaddr *)&ServerAddress,sizeof(ServerAddress),NULL,NULL,NULL,NULL);


Вот урезанный код. НИчего кроме accept сервер не делает.

        //Starts the server.
        public void StartServer()
        {
            SetupServerSocket();

            //если здесь поставить Больше одной итерации, то при первом коннекте имеем большие лаги
            
            for (int i = 0; i < 10; i++)
            {
                _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket);                
            }
        }
        
        private void SetupServerSocket()
        {            
            // Получаем информацию о локальном компьютере
            IPHostEntry localMachineInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint myEndpoint = new IPEndPoint(localMachineInfo.AddressList[0], _serverPort);

            // Создаем сокет, привязываем его к адресу и начинаем прослушивание
            _serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            _serverSocket.Bind(myEndpoint);
            _serverSocket.Listen(100);              
        }

        private void AcceptCallback(IAsyncResult result)
        {
            UserSocket connection = null;
            try
            {
                // Завершение операции Accept
                Socket s = (Socket)result.AsyncState;       
                connection = new UserSocket(s.EndAccept(result));                                
                _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState);
            }
            catch (SocketException exc)
            {
                if (connection != null)
                    connection.CloseConnection();
            }
            catch (Exception exc)
            {                
                if (connection != null)
                    connection.CloseConnection();                
            }           
        } 

        //UserInfo Class
        private class UserSocket 
        {
            private Socket _socket;
            public UserSocket(Socket s)
            {
                _socket = s;
            }     

            public Socket Socket
            {
                get
                { return _socket; }
            }

            public void CloseConnection()
            {                
                if (_socket == null)
                    return;
                _socket.Close();    
            }           
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.