Кажется, что использование socket.Close() для сокета tcp не полностью закрывает сокет. В следующем примере я пытаюсь подключиться к example.com в порту 9999, который не открывается, и после короткого таймаута я пытаюсь закрыть сокет.
for (int i = 0; i < 200; i++)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.LingerState = new LingerOption(false, 0);
sock.BeginConnect("www.example.com", 9999, OnSocketConnected, sock);
System.Threading.Thread.Sleep(50);
sock.Close();
}
Но когда я смотрю на netstat после завершения цикла, я обнаружил, что есть много полуоткрытых сокетов:
TCP israel-xp:6506 www.example.com:9999 SYN_SENT
TCP israel-xp:6507 www.example.com:9999 SYN_SENT
TCP israel-xp:6508 www.example.com:9999 SYN_SENT
TCP israel-xp:6509 www.example.com:9999 SYN_SENT
ИЗМЕНИТЬ , Хорошо, какой-то контекст отсутствовал. Я использую beginconnect, потому что ожидаю, что соединение сокета завершится неудачно (9999 не открывается), и в моем реальном коде я вызываю socket.Close() как только установлен таймер. В OnSocketConnected я вызываю EndConnect, который генерирует исключение (пытается вызвать метод расположенного объекта). Моя цель - короткий тайм-аут для этапа подключения сокета.
Любые подсказки, что я делаю неправильно? Спасибо!