Кажется, что использование 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
EDIT
,
Хорошо, некоторый контекст отсутствовал. Я использую beginconnect, потому что я ожидаю, что соединение с сокетом не будет установлено (9999 не открыт), и в моем реальном коде я вызываю socket.Close (), как только таймер установлен.
На OnSocketConnected я вызываю EndConnect, который выдает исключение (пытаясь вызвать метод удаленного объекта).
Моя цель - сократить время ожидания на этапе подключения к сокету.
Любая подсказка, что я делаю не так?
Спасибо!