Сокеты C #: 2-ым (и больше) пользователям не удается соединиться

1

Я подключаюсь к моему (С#) серверу и из приложения, встроенного в Corona SDK, но для второго человека никогда не может подключиться.

Я пробовал использовать разные IP, т.е. Два сотовых телефона с внешним IP без разницы.

Так работает мой слушатель сервера:

server.cs

void Listener()
    {
        while (isRunning)
        {
            try
            {
                Socket socket = listener.AcceptSocket();

                foreach (var worker in workers)
                    if (worker.IsAvailable)
                    {
                        worker.ProcessNewSocket(socket);
                        break;
                    }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }

    public void Run()
    {
        Console.WriteLine("Server.Run()");
        listener.Start();
        isRunning = true;

        foreach (var worker in workers)
        {
            Thread t = new Thread(worker.Run);
            t.Start();
        }

        Listener();
    }

ServerWorker.cs

public void ProcessNewSocket(Socket socket)
    {
        var pc = new PlayerClient(this);            
        sockets.Add(socket, pc);
    }

    // this method will be called in cycle
    public void Run()
    {

        while (server.IsRunning)
        {
            List<Socket> readList = sockets.Keys.ToList(); //List of sockets that have some data from client available for reading.
            List<Socket> writeList = sockets.Keys.ToList(); //List of sockets that are ready to write (send) to the client. An action was made to a table and the change was sent to PlayerClient.Write and is now stored in the queue (MemoreStream)
            List<Socket> errorList = sockets.Keys.ToList();

            if (readList.Count() != 0 || writeList.Count() != 0 || errorList.Count() != 0)
            {
                // for providing security you can use  System.Net.Security.SslStream here when read/write data,
                // see http://msdn.microsoft.com/ru-ru/library/system.net.security.sslstream(v=vs.110).aspx

                Socket currentSocket = null;

                // foreach socket with events
                try
                {
                    foreach (var s in readList)
                    {
                        currentSocket = s;
                        //TODO: Get the actual length of the message.
                        byte[] data = new byte[2048];
                        s.Receive(data);
                        sockets[s].OnData(data);
                    }

                    foreach (var s in writeList)
                    {
                        currentSocket = s;
                        if (sockets[s].IsWriteDataAvailable())
                        {
                            s.Send(sockets[s].GetWriteBuffer());
                            sockets[s].ClearWriteBuffer();
                        }
                    }

                    foreach (var s in errorList)
                    {
                        //OnError   
                    }
                }
                // we got exception, depending on the type...
                catch (SocketException ex)
                {
                    //Console.WriteLine(ex.ToString());
                    // send client error message, this is not always possible(for example network failure)
                    // maybe we would like to notify his opponent about connection failure
                    // terminate connection

                    if (ex.ErrorCode == (int)SocketError.ConnectionAborted || ex.ErrorCode == (int)SocketError.ConnectionReset)
                        RemoveSocket(currentSocket);
                    else
                        Console.WriteLine("Other problem .. " + ex.ErrorCode.ToString());
                }
            }

        }    

    }

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

Теги:
sockets

1 ответ

0

Я думаю, что выражение "BREAK" в вашем блоке Listener();

           foreach (var worker in workers)

           if (worker.IsAvailable)
                {
                    worker.ProcessNewSocket(socket);
                    break; // this BREAK WILL END YOUR loop AFTER first CLIENT FOUND.
                }

Итак, попробуйте удалить break as;

           foreach (var worker in workers)
           {
              if (worker.IsAvailable)
               {    
                    worker.ProcessNewSocket(socket);
               }
           }    
  • 0
    К сожалению, это не помогло. Также worker.IsAvailable - это просто заглушка для моментов, которые возвращают true, поэтому он всегда будет использовать первый доступный ServerWorker («worker»).
  • 0
    Хммм .. :( Не могли бы вы опубликовать весь код в PEST BIN или где-нибудь и поделиться ссылкой здесь ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню