Вопрос по sockets, java – Ошибка привязки сокета

4

У меня есть тестовое приложение, которое открывает сокет, отправляет что-то через этот сокет, а затем закрывает его. Это делается в цикле 5-10 000 раз. Дело в том, что после 3400 итераций я получаю ошибку такого типа:

java.net.BindException: Address already in use: connect

Я даже установил сокет для немедленного использования, но ошибка сохраняется

try
{
     out_server.write(m.ToByteArray());
     socket_server.setReuseAddress(true);
     socket_server.close();
}
catch(Exception e)
{
     e.printStackTrace();
     System.out.println(i+" unable to register with the server");
}

Что я мог сделать, чтобы это исправить?

Ваш Ответ

7   ответов
2

Мои предложения:

  • flush the socket after the write
  • add a tiny sleep (~50ms?) at the end of the above method

Error: User Rate Limit Exceedednetstat и проанализировать его (или опубликовать здесь)

Error: User Rate Limit Exceeded klaus johan
0

,

11

Большинство операционных систем имеют ограничение на количество сокетов, которые они могут открывать одновременно, но на самом деле это хуже, чем это.

Когда сокет закрыт, он переводится в особое состояние ожидания на определенное время. Обычно это вдвое больше времени жизни пакета, и это гарантирует, что в сети еще нет пакетов, которые находятся на пути к вашему сокету.

По истечении этого времени вы можете быть уверены, что все пакеты в сети уже умерли. Сокет находится в этом особом состоянии, так что пакеты, которые были в сети, когда вы его закрыли, могут быть перехвачены и выброшены, если они прибывают до того, как они умирают.

netstat -a из командной строки и посмотрите, сколько сессий фактически находится в состоянии ожидания.

Если это действительно так, есть несколько способов справиться с этим.

re-use your sessions, either manually or by maintaining a connection pool. introduce a delay in each connection to try and stop reaching the saturation point. go flat out until you reach saturation and then modify your behaviour, such as running your connect logic inside a while statement that retries for up to 60 times with a two-second delay each time before giving up totally. This lets you run at full speed, slowing down only if there's a problem.

set maxdelay to 16 # maximum time period between attempts
set maxtries to 10 # maximum attempts

set delay to 0
set tries to 0
while more actions needed:
    if delay is not 0:
        sleep delay
    attempt action
    if action failed:
        add 1 to tries
        if tries is greater than maxtries:
           exit with permanent error
        if delay is 0:
            set delay to 1
        else:
            double delay
            if delay is greater than maxdelay:
                set delay to maxdelay
    else:
        set delay to 0
        set tries to 0

Error: User Rate Limit Exceeded
0

2

MaxUserPorthttp://technet.microsoft.com/en-us/library/aa995661.aspx а такжеTIME_WAIT

TIME_WAITTIME_WAIT

MaxUserPortTIME_WAITTIME_WAITTIME_WAITMAY

Error: User Rate Limit Exceeded klaus johan
Error: User Rate Limit Exceedednetsh interface ipv4 show dynamicportrange tcp показать, и соответствующийset команда, чтобы изменить эти значения. Компьютер под управлением Windows 7 Enterprise, который мне приходилось иметь, имел по умолчанию 16384 динамических порта, что в значительной степени снимало это ограничение.
Не существует соответствующего ограничения на входящие соединения.
0

1

Error: User Rate Limit Exceeded

Похожие вопросы