Tôi đang thực hiện một số thử nghiệm cố gắng cách ly một số hành vi kỳ lạ trong các thư viện (.NET). Khi tôi sử dụng Winsock API thông qua C++ và chỉ đơn giản gọi, closesocket(), tôi thấy bên cửa sổ gửi gói FIN/ACK và phía xa gửi lại một gói ACK. Đây là những gì tôi sẽ gọi là một duyên dáng gần gũi. Tuy nhiên, khi lập trình trong C# tôi không nhìn thấy những gì tôi sẽ gọi là một gần duyên dáng.Làm thế nào để ngăn chặn các thư viện .NET gửi gói RST đến gần
Trong C#, tôi mở ổ cắm và sau đó, khi đóng nó, tôi thấy các cửa sổ gửi gói FIN Chỉ khi lần đầu tiên gọi Socket.Shutdown(). Tuy nhiên, bất kể, khi tôi gọi Socket.Close() trong C#, một gói tin RST được gửi đi và kết nối được giảm xuống. Điều này làm tôi bối rối vì, từ những gì tôi đã đọc trên mạng, quá trình đóng TCP phải là FIN/ACK -> ACK (từ cả hai phía thực sự nhưng hiện tại, tôi chỉ quan tâm đến mặt "của tôi"); tức là không nên có một gói RST trong hỗn hợp. Từ những gì tôi đã đọc, rõ ràng, một gói RST chỉ được gửi khi người nhận không chắc chắn về trạng thái kết nối và muốn ra ngoài.
Tại sao gói RST này được gửi khi bị tắt theo kế hoạch trong .NET và hoàn toàn không bị ngừng hoạt động theo kế hoạch từ API winsock? Có cách nào để ngăn chặn việc truyền tải một gói RST trong một shutdown duyên dáng từ .NET?
Trong trường hợp nó quan trọng, trong cả hai đường dẫn mã, tôi đang đọc tất cả dữ liệu có sẵn trên socket trước khi gọi phương thức close() tương ứng.
Điều đó thật thú vị. Tôi sẽ phải xem điều gì xảy ra khi tôi thực hiện một giấc ngủ. Tôi tự hỏi những gì khác sẽ hiển thị bởi vì tôi không nghĩ rằng điều này là khả thi (nếu nó hoạt động) cho bối cảnh đầy đủ trong đó điều này đang xảy ra. Tôi đã thực hiện các chương trình bộ xương để cô lập hành vi. Cảm ơn dù sao mặc dù bởi vì tôi đã không nghĩ đến việc sử dụng một cuộc gọi giấc ngủ ở đây. –