Мне кажется, я понимаю, почему у вас возникла проблема, и похоже, что она основана на неправильном понимании того, что должен делать тайм-аут.
Ради тестирования я изменил ваш код так:
var sw = Stopwatch.StartNew();
res = c.BeginConnect("127.0.0.1", 12, null, null);
success = res.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10));
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
В Windows я вижу, что соединение разрывается через ~ 1 секунду, в то время как при запуске того же кода в Linux оно почти мгновенно прерывается. Кажется, что Linux способен работать, если соединение возможно быстрее, чем Windows. Я думаю, что, возможно, вы ошибаетесь во времени, которое Windows тратит на разработку, но не может связываться с указанным вами временем ожидания.
Далее: Что такое тайм-аут? Тайм-аут - это максимум времени, которое может потребоваться для установления соединения. Это предел . Это означает, что операция должна завершиться менее чем за X секунд (например, 10 секунд), или она не выполнена. Если операция завершится через 1 секунду, она будет немедленно возвращена.