2012-06-13 7 views
5

Ich habe C# Socket Server. Es zählen Max Clients, die in der Lage sind, mit dem Server etwa 800 zu verbinden. Wenn Clients mehr als 800 neue Clients den Socket-Fehler WSAECONNREFUSED 10061 erhalten. Wie zählen raizup max clients?C# Socket Server nicht mehr 800 Clients haben

Socket schreiben zwischen Socket.BeginXXX und socket.EndXXX. Ziel: Framework 4.0. Protokolle: IP4, TCP

+2

Klingt wie die Hörer-Warteschlange voll ist. Kannst du etwas Code einfügen? –

+0

Ein Router oder eine Firewall kann auch die Anzahl verfügbarer Ports begrenzen. – Groo

+0

@Groo ist hier nur ein Port im Spiel, der Port, auf dem der Server lauscht. – EJP

Antwort

1

Wenn Sie den Server-Socket in den Abhörstatus versetzen, können Sie den Rückstand einstellen. Das ist die maximale Anzahl von Verbindungen, die auf die Annahme warten können.

Alles andere ist möglicherweise ein Hardwareproblem - versuchen Sie, das Programm auf einem anderen Computer auszuführen. Hier

ist ein Beispiel eines

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

Hardware-Problem wie? Wie kann die Hardware dazu führen, dass TCP zurückgesetzt und Verbindungen verweigert werden? – EJP

+0

Ich dachte an die Linien der Netzwerkkarten. Es ist eine hypothetische, die völlig irrelevant sein kann. – Johannes

3

Der Zuhörer Backlogwarteschlange voll ist. Wenn die Backlog-Warteschlange voll ist, beginnt Windows, RSTs an weitere eingehende Verbindungen zu senden, die bei den betroffenen Clients "Verbindung abgelehnt" werden. Sie können die Rückstandswarteschlangenlänge wie in anderen Antworten hier erhöhen, aber was es wirklich bedeutet, ist, dass Sie nicht schnell genug verarbeiten. Sehen Sie sich den Code an, der das tut, und fetten Sie den Pfad. Stellen Sie sicher, dass es nichts tut sonst, wie Blockierung von E/A, Disk I/O, andere Netzwerkvorgänge. Sobald die Verbindung akzeptiert wurde, ist sie aus der Backlog-Warteschlange entfernt, sodass andere eingehende Verbindungen erfolgreich ausgeführt werden können.

2

Hallo ich finde Antwort auf meine Frage. Ich erstelle zusätzlichen Thread für die Verbindung akzeptieren. Zum Beispiel:

Zurück

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); 
      } 
     } 

Auf diese Weise Client-Verbindung zählen keine raize 800

Derzeit wird diese i schreiben:

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"); 
       } 
      } 
     } 

Auf diese Weise Client-Verbindung zählen raize über 2000. Lese und schreibe ich mit BeginXXX und EndXXX.

+0

Ich bin so verwirrt könnte jemand mehr Licht auf diese ... wenn ich eine Schleife, die 1000 Verbindungen zum Hörer schafft ... Warum würde ich bekommen "Zusätzliche Informationen: Keine Verbindung hergestellt werden konnte, weil die Zielmaschine aktiv abgelehnt es "wenn es einen Rückstand von wie MaxConnectoins = 2147483647 gibt ... wie programmiere ich, um das auf dem Zuhörer zu überwachen ... dh, wie weiß ich, wann der Zuhörer Verbindungen ... ablehnt, das ist, was es tut. Fehlercode 10061 PLZ helfen thx – Seabizkit

Verwandte Themen