Tôi đang gặp sự cố khi nhận dữ liệu từ ứng dụng khách sử dụng ổ cắm mạng. Máy khách đang liên lạc với TCP và gửi một hoặc hai gói trước khi đóng kết nối ngay lập tức. Buổi tiếp tân sẽ diễn ra như sau:Đặt lại kết nối ổ cắm trước khi tôi có thể đọc dữ liệu
Socket newConnection = listener.EndAccept(ar);
newConnection.BeginReceive(myBuffer,0, length, SocketFlags.None, Callback,null);
và việc thực hiện sẽ không tiếp tục. Các beginReceive sẽ ngay lập tức ném một SocketException nói rằng kết nối đã được thiết lập lại. Tôi không thể quản lý để nhận được dữ liệu nhận được.
Dưới đây là những gì tôi nhìn thấy cho kết nối này trên Wireshark:
SYN // SYN, AKC // AKC
PSH, ACK for 156 bytes
PSH, ACK for 176 bytes
RST, ACK
Và đó là nó. Có phương tiện nào để nhận dữ liệu này ngay cả khi kết nối được khách hàng đóng không?
Có cách nào bạn có thể có khách hàng của bạn chờ đợi cho một "công nhận" gói từ chương trình tiếp nhận của bạn trước khi đóng cửa? –
Tôi không thể thực sự. Khách hàng được sử dụng trên các máy chủ khác và nó hoạt động, vì vậy tôi sẽ có thể làm như vậy. Tôi không có quyền truy cập vào mã nguồn của các máy chủ khác này để xem cách thực hiện. –
Không nhiều bạn có thể làm gì nếu bạn chưa đọc dữ liệu trước khi RST đi vào (điều này cho biết người gửi đang đóng một cách hủy bỏ). Tại sao người gửi gửi một RST thay vì một FIN (tức là gần duyên dáng, [Socket.Shutdown] (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx))? –