Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > RemoteEndPoint


Автор: DEADLY 5.4.2011, 07:13
есть листенер на 5000 порт например,
Код

IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = IPAddress.Parse("172.27.2.6");
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 5000);
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            reset = false;
            data = null;
            socketsList.Clear();
            acceptedList.Clear();
            socketsList.Add(listener);
            Console.WriteLine("StartListening по 6000 порту");
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(1000);
                while (!reset)
                {
                    allDone.Reset();
                    acceptedList.Clear();
                    for (int i = 0; i < socketsList.Count; i++)
                        acceptedList.Add(socketsList[i]);
                    Socket.Select(acceptedList, null, null, 1000);                   
                    for (int i = 0; i < acceptedList.Count; i++)
                    {
                        if (acceptedList[i] == listener)
                        {                            
                            listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
                            allDone.WaitOne();
                        }
                        else
                        {                            
                            int ind = socketsList.IndexOf(acceptedList[i]);                            
                            if (ind < 0)
                            {
                                Console.WriteLine("сбой подключения");
                            }
                            else
                            {
                                Socket client = (Socket)socketsList[ind];
                                StateObject slave = new StateObject();
                                slave.workSocket = client;                                
                                try
                                {
                                    if (client.Connected)
                                    {                                        
                                        client.BeginReceive(slave.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), slave);
                                        allDone.WaitOne();
                                    }
                                    else if (socketsList.Contains(client))
                                        socketsList.RemoveAt(ind);
                                }

                                catch (Exception e)
                                {
                                    Console.WriteLine(e.ToString());
                                    if (socketsList.Contains(client))
                                        socketsList.RemoveAt(ind);
                                    if (client.Connected)
                                    {
                                        client.Shutdown(SocketShutdown.Both);
                                        client.Close();
                                    }
                                }
                            }
                        }
                    }
                }
                Console.WriteLine("+++++++++++++Reseting listener+++++++++++++");
                for (int i = 0; i < socketsList.Count; i++)
                {
                    Socket sock = (Socket)socketsList[i];
                    sock.Close();
                }
                Console.WriteLine("Clear sockets done. Start new listening");
                StartListening();
            }
            catch (Exception e)
            {
                Console.WriteLine("КРИТИЧЕСКАЯ ОШИБКА\n" + e.ToString());
                for (int i = 0; i < socketsList.Count; i++)
                {
                    Socket sock = (Socket)socketsList[i];
                    sock.Close();
                }
                listener.Close();
                StartListening();
            }
        }

 все конекты кладутся в лист
Код

private static void AcceptCallback(IAsyncResult ar)
        {
            try
            {
                allDone.Set();
                Socket listener = (Socket)ar.AsyncState;
                Socket handler = listener.EndAccept(ar);
                socketsList.Add(handler);

                StateObject state = new StateObject();
                state.workSocket = handler;
                //handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

после мне нада на определеный сокет кинуть команду, но на 
Код

for (int i = 0; i < socketsList.Count; i++)
                {
                    
                        Socket arm = (Socket)socketsList[i];                        
                        armip = ((IPEndPoint)arm.RemoteEndPoint).Address.ToString();
                 }

выдает SocketException <0x80004005>: ... no address was supplied

Автор: DEADLY 5.4.2011, 09:44
проблема решена 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)