2012-06-13 22 views
5

Tengo el servidor de socket C#. Los clientes máximos cuentan con capacidad para conectarse con el servidor alrededor de 800. Si los clientes tienen más de 800 clientes nuevos, obtienen un error de socket WSAECONNREFUSED 10061. ¿Cómo cuentan los clientes de raizeup max?C# Socket Server no tiene más 800 clientes

Socket write between socket.BeginXXX y socket.EndXXX. Objetivo: marco 4.0. Protocolos: IP4, TCP

+2

Parece que la cola de escucha está llena. ¿Puedes pegar algún código? –

+0

Un enrutador o un firewall también pueden limitar el rango de puertos disponibles. – Groo

+0

@Groo solo hay un puerto en juego aquí, el puerto en el que el servidor está escuchando. – EJP

Respuesta

1

Al establecer serversocket en su estado de escucha, puede configurar el retraso acumulado. Esa es la cantidad máxima de conexiones que pueden estar esperando ser aceptadas.

Todo lo demás es posiblemente un problema de hardware: intente ejecutar el programa en una máquina diferente.

Aquí es un ejemplo de un

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

Problema de hardware, ¿cómo? ¿Cómo puede el hardware provocar reinicios TCP y conexiones rechazadas? – EJP

+0

Estaba pensando en las líneas de las tarjetas de red. Es un hipotético que puede ser completamente irrelevante. – Johannes

3

La cola oyente cartera está llena. Cuando la cola de espera está llena, Windows comenzará a enviar RST a otras conexiones entrantes, que se convierten en "conexión rechazada" en el cliente (s) en cuestión. Puede aumentar la longitud de la cola de trabajos acumulados según otras respuestas aquí, pero lo que realmente significa es que no está procesando acepta lo suficientemente rápido. Eche un buen vistazo al código que lo hace y engrase la ruta. Asegúrese de que no haga nada else, como bloquear E/S, E/S de disco, otras operaciones de red. Una vez que se acepta la conexión, está fuera de la cola de espera para que otras conexiones entrantes puedan tener éxito.

2

Hola, encuentro la respuesta a mi pregunta. Creo hilo adicional para aceptar la conexión. Por ejemplo:

Anterior

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

Por esta conexión de cliente manera contar sin raize 800

Actualmente escribo esto:

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

Por esta conexión de cliente manera contar raize más de 2.000. Lee y escribo lo hago con BeginXXX y EndXXX.

+0

Estoy tan confundido que alguien podría arrojar más luz sobre esto ... si tengo un bucle que crea 1000 conexiones con el oyente ... ¿por qué iba a obtener "Información adicional: No se pudo establecer conexión porque la máquina de destino se negó activamente "cuando hay un retraso de MaxConnectoins = 2147483647 ... cómo codigo para monitorear esto en el oyente ... es decir, cómo sé cuándo el oyente rechazará las conexiones ... suponiendo que eso es lo que está haciendo. Código de error 10061 por favor ayuda thx – Seabizkit

Cuestiones relacionadas