Я должен реализовать свои собственные тайм-ауты сокета TCP/IP?

Это должно покрыть Вас:

String lines[] = string.split("\\r?\\n");

существует только действительно две новых строки (UNIX и Windows), что необходимо волноваться о.

5
задан Nitramk 14 October 2009 в 19:20
поделиться

5 ответов

В Linux вы можете

int syncnt = 1;
int syncnt_sz = sizeof(syncnt);
setsockopt(sockfd, IPPROTO_TCP, TCP_SYNCNT, &syncnt, syncnt_sz);

уменьшить (или увеличить) количество повторных попыток SYN на соединение на сокет. К сожалению, он не переносится в Windows.

Что касается предложенного вами решения: закрытие сокета, пока он все еще находится в состоянии подключения, должно быть нормальным, и это, вероятно, самый простой способ. Но поскольку похоже, что вы уже используете асинхронное завершение, можете ли вы просто попытаться открыть четыре соединения за раз? Если все четыре тайм-аута, по крайней мере, это займет всего 20 секунд вместо 80.

3
ответ дан 13 December 2019 в 19:30
поделиться

Вы можете попробовать открыть сразу несколько соединений (каждое со своим собственным сокетом), а затем работать с тем, которое откликается первым. Остальные могут быть закрыты.

Вы можете сделать это с помощью неблокирующих вызовов open или с помощью блокирующих вызовов и потоков. Тогда задержка в ожидании открытия соединения не должна быть больше минимально необходимой.

1
ответ дан 13 December 2019 в 19:30
поделиться

Если вы используете порты завершения ввода-вывода и асинхронные операции, почему вам нужно ждать завершения соединения, прежде чем переходить к следующему серверу в списке? Используйте ConnectEx и передайте перекрывающуюся структуру. Таким образом, время подключения отдельного сервера не складывается, общее время подключения - это максимальное время подключения к серверу, а не сумма.

5
ответ дан 13 December 2019 в 19:30
поделиться

Все настраиваемые параметры TCP / IP для Windows находятся здесь

См. TcpMaxConnectRetransmissions

1
ответ дан 13 December 2019 в 19:30
поделиться

Вы должны быть осторожны при отмене тайм-аута сокета. Если вы слишком агрессивны и пытаетесь подключиться ко многим серверам очень быстро, тогда стек TCP / IP Windows будет считать, что ваше приложение является интернет-червем, и подавлять его. Если это произойдет, производительность вашего приложения станет еще хуже.

Детали того, когда именно происходит обратное дросселирование, не разглашаются, но предлагаемый вами тайм-аут (5 секунд), по моему опыту, должен быть нормальным.

Подробные сведения об этом можно найти здесь

1
ответ дан 13 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

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