Dường như sử dụng socket.Close() cho một socket tcp, không đóng hoàn toàn socket. Trong ví dụ sau, tôi đang cố gắng kết nối với example.com tại cổng 9999, không được mở và sau một khoảng thời gian chờ ngắn, tôi đang cố gắng đóng socket.Socket.Close không thực sự đóng socket tcp? (C#)
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();
}
Nhưng khi tôi hãy nhìn vào netstat sau khi vòng lặp hoàn thành, tôi thấy rằng có rất nhiều ổ cắm nửa mở:
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 . Ok, một số ngữ cảnh bị thiếu. Tôi đang sử dụng beginconnect vì tôi mong đợi kết nối socket thất bại (9999 không được mở), và trong mã thực của tôi, tôi gọi socket.Close() khi bộ hẹn giờ được đặt. Trên OnSocketConnected tôi gọi EndConnect, mà ném một ngoại lệ (cố gắng gọi một phương thức của một đối tượng xử lý). Mục tiêu của tôi là có thời gian chờ ngắn cho giai đoạn kết nối socket.
Bất kỳ đầu mối nào tôi đang làm sai? Cảm ơn!
có ý nghĩa, nhưng không phải là thiết lập linger để sai nên giải quyết nó? – r0u1i
oh, nán lại không làm điều này. Vì vậy, không có thực sự là một cách để làm cho Windows chấm dứt socket. – r0u1i
theo mặc định, nó sẽ ở trạng thái FIN_WAIT trong 4 phút trước khi Windows thực sự đóng nó lại. Thậm chí thú vị hơn là nếu bạn mở lại kết nối khác với cùng một cổng đích/cổng sẽ sử dụng lại các kết nối trong FIN_WAIT khớp với nhau. – Jay