# Only one usage of each socket address (protocol/network address/port) is normally permitted

**URL:** <https://community.latromi.com.br/t/only-one-usage-of-each-socket-address-protocol-network-address-port-is-normally-permitted/1185>\
**Category:** Solução de Problemas\
**Tags:** infra\
**Created:** [Fevereiro 17, 2024, 7:06pm UTC](https://community.latromi.com.br/t/only-one-usage-of-each-socket-address-protocol-network-address-port-is-normally-permitted/1185 "2024-02-17T19:06:49Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Fevereiro 17, 2024, 7:06pm UTC](https://community.latromi.com.br/t/only-one-usage-of-each-socket-address-protocol-network-address-port-is-normally-permitted/1185/1 "2024-02-17T19:06:49Z")

</div>

## Problema

A aplicação apresenta erros de conexão com o banco de dados, e em alguns casos, pode resultar na interrupção do **Pool de Aplicativos** do IIS, devido a erros na inicialização da aplicação.

Nessa situação, a mensagem a seguir poderá ser observada nos logs de arquivo de texto:

> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted

A mensagem também pode ser apresentada em **português** :

> System.Net.Sockets.SocketException: Normalmente é permitida apenas uma utilização de cada endereço de soquete (protocolo/endereço de rede/porta)

## Causa

De forma resumida, este erro ocorre quando o Windows não tem mais **portas dinâmicas disponíveis** para estabelecer uma nova comunicação TCP/IP. Neste caso, uma comunicação de rede entre servidor de aplicação e de banco de dados.

### Conexão em estado TIME\_WAIT

Embora as conexões com o banco de dados estejam sendo **encerradas corretamente** pela aplicação, a comunicação entre os dois computadores não é finalizada imeditamente. Ela continua estabelecida, porém em estado **TIME\_WAIT**.

As conexões em estado **TIME\_WAIT** podem ser verificadas com o seguinte comando:

```nohighlight
netstat -a

```

 ![image](https://community.latromi.com.br/uploads/default/original/2X/6/6c4fdb0db2e7e77f3faf0b382deceba08c0efa99.png)

Mesmo encerrando a aplicação no IIS, as conexões continuarão em estado **TIME\_WAIT** , pois quem gerencia isso é o Sistema Operacional, e não a aplicação.

Por padrão, o Windows aguarda entre 2 e 4 minutos para encerrar conexões no estado **TIME\_WAIT**.

### Intervalo de portas dinâmicas

Ao tentar estabelecer uma nova conexão TCP/IP (neste caso com o servidor de banco de dados), o Window utiliza uma **porta dinâmica** disponível. Porém o número de portas que podem ser utilizadas nesta operação é **limitado**.

O intervalo de portas dinâmicas definido para o protocolo TCP pode ser verificado com a seguinte linha de comando:

```nohighlight
netsh int ipv4 show dynamicport tcp

```

![image](https://community.latromi.com.br/uploads/default/original/2X/d/d8a73ed7383d9a6e77c679afe0812692aae48f8d.png)

### Esgotamento de Portas

Uma porta dinâmica usada em uma conexão TCP/IP entre dois computadores não poderá ser reutilizada enquanto a conexão estiver em estado **TIME\_WAIT**.

Eventualmente, com o acúmulo de conexões neste estado, ocorrerá o esgotamento de portas dinâmicas, o que levará a ocorrência dos erros.

## Solução

Existem 3 soluções que podem ser usadas combinadas ou individualmente para solucionar o problema:

### Utilizar Pooling de Conexões

Usando o Pool de Conexões, você terá um número menor de novas conxões sendo abertas, e consequentemente, vai ser mais difícil esgotar o número de portas dinâmicas.

Mais informações neste tópico: [Pooling de Conexões](https://community.latromi.com.br/t/pooling-de-conexoes/1055)

### Reduzir o tempo de TIME\_WAIT

Reduzindo o tempo de **TIME\_WAIT** , a porta bloqueada será liberada mais cedo, e consequentemente, vai ser mais difícil esgotar o número de portas dinâmicas.

Para definir **TcpTimedWaitDelay** (tempo limite do TIME\_WAIT):

1. Use o comando `regedit` para acessar a subchave do registro `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters` .

2. Crie um novo valor `REG_DWORD` chamado “TcpTimedWaitDelay”, e defina o valor como `30` (segundos).

3. Crie um novo valor `REG_DWORD` chamado “StrictTimeWaitSeqCheck”, e defina o valor como `1`.

4. Reinicie o sistema.

O parâmetro "TcpTimedWaitDelay" deve ser definido para garantir que o sistema operacional, vai aplicar o valor de "StrictTimeWaitSeqCheck".

### Aumentar o intervalo de portas dinâmicas

Aumentando o número de portas dinâmicas, será possível ter mais conexões simultâneas em estado **TIME\_WAIT**.

Para definir **MaxUserPort** (intervalo de portas dinâmicas):

1. Use o comando `regedit` para acessar a subchave do registro `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters`.

2. Crie um novo valor `REG_DWORD` chamado “MaxUserPort”.

3. Defina esse valor como `65534` (máximo).

4. Reinicie o sistema.

* * *

Mais informações aqui: [Only one usage of each socket address (protocol/network address/port) is normally permitted | Microsoft Learn](https://learn.microsoft.com/pt-br/archive/blogs/dgorti/only-one-usage-of-each-socket-address-protocolnetwork-addressport-is-normally-permitted)
