2013-02-27 30 views
5

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?

+0

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? –

+0

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. –

+0

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))? –

Trả lời

-1

Trước hết với loại giao tiếp này, bạn nên chuyển sang UDP thay vì TCP - theo cách đó bạn sẽ có thể nhận gói bất kể trạng thái của người gửi.
Giả sử TCP được lựa chọn duy nhất - Tôi sẽ đề nghị sử dụng các cuộc gọi đồng bộ:

Socket newConnection = listener.AcceptSocket(); 
newConnection.Receive(myBuffer, 0, length, SocketFlags.None); 
+1

Nếu anh ta phải thay đổi máy khách để sử dụng UDP, anh ta cũng có thể thay đổi nó không gửi RST. –

+0

Và sử dụng cuộc gọi đồng bộ không thay đổi bất cứ điều gì. Ổ cắm vẫn sẽ được thiết lập lại vào thời điểm cuộc gọi AcceptSocket kết thúc và Receive vẫn sẽ ném –

Các vấn đề liên quan