Кажется, что использование 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, который вызывает исключение (пытается вызвать метод удаленного объекта). Моя цель - иметь короткий тайм-аут для этапа подключения сокета.
Есть какие-нибудь подсказки, что я делаю не так? Спасибо!