tcp соединяют тайм-аут (портативный Unix/окна)

Я использую жемчуг (который, надо надеяться, ни на что не должен влиять), но я должен знать, как я могу установить тайм-аут для операции подключения. Проблема, я не могу ждать навсегда, чтобы операция подключения произошла. Если этого не происходит в течение нескольких секунд, я быть бы давание и движение.

socket(my $sock, PF_INET, SOCK_STREAM, (getprotobyname('tcp'))[2]);
setsockopt($sock, SOL_SOCKET, SO_SNDTIMEO, 10); # send timeout

print "connecting...\n";
connect($sock, sockaddr_in(80,scalar gethostbyname('lossy.host.com')));
print "connected...\n";

Проблема, если соединение с "lossy.host.com" является "с потерями" или медленным или что-нибудь, но быстро, я сдался бы, чем заставил бы пользователя ожидать. (Думайте о нем как о побочном эффекте к программе, которая делает что-то еще... пользователь, вероятно, не ожидает, что этот сценарий свяжется с сервером где-нибудь...).

Поточная обработка Случая: Как Вы прервали бы подключение ()? Вы просто отсоединили бы поток и забыли бы об этом?

5
задан dlamotte 11 January 2010 в 18:52
поделиться

3 ответа

Обычно магическое число - оставить его в покое. ThreadPool хорошо справляется с этим.

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

Создайте профиль приложения, чтобы найти правильный номер.

-121--1330764-

Существует множество учебных пособий WPF для глянцевых кнопок. В основном, создайте обычную кнопку и используйте комбинацию эффектов и градиентов, чтобы изменить шаблон управления кнопкой, чтобы выглядеть как кнопка iPhone. Это образец, но вы можете сделать гораздо больше: http://craig.palenshus.com/silverlight/silverlight-and-the-content-presenter-in-an-iphone-like-button/

-121--3464943-

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

Чтобы ответить на первоначальный вопрос, я не думаю, что есть способ изменить тайм-аут connect () , по крайней мере, не через API сокетов. В Windows я не удивлюсь, если есть раздел реестра, который вы можете изменить, который повлияет на него, но я не знаю, что это будет.

1
ответ дан 15 December 2019 в 06:27
поделиться

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

Я знаю, как это сделать на C, но не на perl, иначе я бы привел вам пример. В man-странице perlfunc говорится, что все эти функции существуют, и беглое чтение, похоже, говорит о том, что они будут работать так, как вы хотите.

Изменить: извините, пропущена часть, где perlfunc говорит, что они могут быть недоступны в системах, отличных от Unix, и действительно, fcntl недоступен в win32. Однако есть библиотека IO :: Socket, которую вы можете использовать, которая будет правильно работать в Windows.

Вот пример кода, который у меня работает (в любом случае на Linux):

 #! / Usr / bin / perl 
 
use IO :: Socket :: INET; {{1} } использовать IO :: Select; 
 
 $ sock = IO :: Socket :: INET-> new ('PeerAddr' => 'lossy.host.com', 
 ' PeerPort '=> 80, 
' Blocking '=> 0); 
 
 $ sel = IO :: Select-> new ($ sock); 
 { {1}} @ write = $ sel-> can_write (10); 
 
if ($ sock-> connected) {
print "сокет подключен \ n"; { {1}}} else {
print "сокет не подключен через какое-то время \ n"; 
 $ sock-> close; 
} 
2
ответ дан 15 December 2019 в 06:27
поделиться

Если вы в конечном итоге выполните случай с потоками, в котором вы отсоединяете соединительный поток, не прерывая его, помните о следующем: Windows позволяет иметь максимум 10 ожидающих исходящих TCP-соединений (11-е будет заблокировано до тех пор, пока одно из ожидающих не завершится). вне).

Это было для меня причиной большого разочарования. Я думаю, что MS вставила это, чтобы предотвратить распространение ботнетов или что-то в этом роде. Я тоже не думаю, что есть возможность его выключить.

0
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

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