2012-06-13 6 views
5

Mam serwer C#. Max klienci liczą, kto może połączyć się z serwerem około 800. Jeśli klienci ponad 800 nowych klientów otrzymają błąd gniazda WSAECONNREFUSED 10061. Jak liczą się klienci maksymalnego skracania?Serwer C# Socket nie ma więcej klientów 800

Gniazdo zapisu między gniazdem.BeginXXX i gniazdem.EndXXX. Cel: framework 4.0. Protokoły: IP4, TCP

+2

Brzmi jak kolejka odbiornika jest pełna. Czy możesz wkleić jakiś kod? –

+0

Router lub zapora sieciowa mogą również ograniczać zasięg dostępnych portów. – Groo

+0

@Groo jest tu tylko jeden port, port, na którym nasłuchuje serwer. – EJP

Odpowiedz

1

Po ustawieniu serwera w stan odsłuchu można ustawić zaległości. Jest to maksymalna liczba połączeń, które mogą czekać na akceptację.

Cała reszta to prawdopodobnie problem ze sprzętem - spróbuj uruchomić program na innym komputerze.

Oto przykład

Socket serversocket = ... 
serversocket.Listen(1000); 
+0

Problem ze sprzętem jak? W jaki sposób sprzęt może powodować resetowanie i odrzucanie połączeń TCP? – EJP

+0

Myślałem o liniach kart sieciowych. Jest to hipotetyczne, które może być zupełnie nieistotne. – Johannes

3

Kolejka słuchacz zaległości jest pełny. Gdy kolejka zaległości jest pełna, system Windows rozpocznie wysyłanie komunikatów RST do kolejnych połączeń przychodzących, które stają się "odrzuconymi połączeniami" u danego klienta (ów). Możesz podnieść długość kolejki zaległości zgodnie z innymi odpowiedziami tutaj, ale to naprawdę oznacza, że ​​nie przetwarzasz akceptacji wystarczająco szybko. Przyjrzyj się kodowi, który to robi i posmaruj ścieżkę. Upewnij się, że nie robi to nic innego, jak: else, takich jak blokowanie operacji we/wy, dyskowych operacji we/wy, innych operacji sieciowych. Po zaakceptowaniu połączenia jest ono wyłączone z kolejki zaległości, aby inne połączenia przychodzące mogły się powieść.

2

Witam, znajduję odpowiedź na moje pytanie. Tworzę dodatkowy wątek do akceptowania połączenia. Na przykład:

Poprzednia

IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Parse(_serverAddress), _port); 
_serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

_serverSocket.Bind(myEndpoint); 
_serverSocket.Listen((int)SocketOptionName.MaxConnections); 

_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); 

..... 


private void AcceptCallback(IAsyncResult result) 
     { 
      ConnectionInfo connection = new ConnectionInfo(); 
      try 
      { 
       Socket s = (Socket)result.AsyncState; 
       connection.Socket = s.EndAccept(result); 

       connection.Buffer = new byte[1024]; 
       connection.Socket.BeginReceive(connection.Buffer, 
        0, connection.Buffer.Length, SocketFlags.None, 
        new AsyncCallback(ReceiveCallback), 
        connection); 
      } 
      catch (SocketException exc) 
      { 
       CloseConnection(connection, "Exception in Accept"); 
      } 
      catch (Exception exc) 
      { 
       CloseConnection(connection, "Exception in Accept"); 
      } 
      finally 
      { 

        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState); 
      } 
     } 

w ten sposób połączenia klienta liczyć nie Raize 800

Obecnie piszę to:

IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Parse(_serverAddress), _port); 
_serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

_serverSocket.Bind(myEndpoint); 
_serverSocket.Listen((int)SocketOptionName.MaxConnections); 

acceptThread = new Thread(new ThreadStart(ExecuteAccept)); 
acceptThread.Start(); 

...... 

private void ExecuteAccept() 
     { 

      while (true) 
      { 

       ConnectionInfo connection = new ConnectionInfo(); 
       try 
       { 
        connection.Socket = _serverSocket.Accept(); 

        connection.Buffer = new byte[1024]; 
        connection.Socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), connection); 
       } 
       catch (SocketException exc) 
       { 
        CloseConnection(connection, "Exception in Accept"); 
       } 
       catch (Exception exc) 
       { 
        CloseConnection(connection, "Exception in Accept"); 
       } 
      } 
     } 

w ten sposób połączenia klienta liczyć Raize ponad 2000. Odczyt i zapis robię przy pomocy BeginXXX i EndXXX.

+0

Jestem tak zdezorientowany, że ktoś może rzucić więcej światła na ten temat ... jeśli mam pętlę, która tworzy 1000 połączeń do słuchacza ... dlaczego dostanę "Dodatkowe informacje: Nie można nawiązać połączenia, ponieważ aktywna maszyna docelowa odmówiła to "kiedy jest zaległości jak MaxConnectoins = 2147483647 ... jak kodować, aby monitorować to na słuchaczu ... tj. skąd mam wiedzieć, kiedy słuchacz odrzuci połączenia ... przejmując to, co robi. Kod błędu 10061 plz help thx – Seabizkit