2012-08-01 16 views
7

Tôi đang làm việc trên một ứng dụng mà khách hàng kết nối với một kết nối TCP sau đó kích hoạt một lượng công việc có khả năng mất nhiều thời gian để hoàn thành. Tác phẩm này phải bị hủy nếu người dùng bỏ kết nối TCP.Việc ghi byte không vào luồng mạng có phải là cách đáng tin cậy để phát hiện các kết nối đã đóng không?

Hiện nay, những gì tôi đang làm là bắt đầu lên một giờ mà định kỳ kiểm tra các mạng lưới suối kết nối bằng cách làm này:

// stream is a Stream instance 
var abort = false; 
using (new Timer(x => { 
    try 
    { 
     stream.Write(new byte[0], 0, 0); 
    } 
    catch (Exception) 
    { 
     abort = true; 
    } 
}, null, 1000, 1000)) 
{ 
    // Do expensive work here and check abort periodically 
} 

tôi đã có thể thích để đọc CanWrite, CanRead hoặc Connected nhưng họ báo cáo trạng thái cuối cùng của luồng. Là viết zero byte một cách đáng tin cậy của thử nghiệm kết nối, hoặc có thể điều này chính nó gây ra vấn đề? Tôi không thể viết hoặc đọc bất kỳ dữ liệu thực nào trên luồng vì điều đó sẽ làm hỏng khách hàng.

Trả lời

3

Hãy nói rằng tôi đã biết nó hoạt động, cách đây nhiều thập kỷ, nhưng không có lý do thực chất nào tại sao nó nên. Bất kỳ lớp API nào giữa bạn và ngăn xếp TCP đều có quyền ngăn chặn cuộc gọi đến lớp tiếp theo, và ngay cả khi nó được đưa vào ngăn xếp, nó sẽ chỉ trả lại lỗi nếu:

  1. đối với lỗi mạng trước khi kiểm tra độ dài bằng 0, phụ thuộc vào việc triển khai thực hiện và
  2. Đã xảy ra lỗi mạng, do một số hoạt động trước đó hoặc RST đến.

Nếu bạn đang mong đợi nó thăm dò một cách kỳ diệu mạng từ đầu đến cuối, chắc chắn là không.

+0

Dường như có hiệu quả với tôi, nhưng tôi có thể thấy quan điểm của bạn. Tôi không mong đợi nó thăm dò tất cả các cách, nhưng nếu nó đã đi một cách nhỏ nó có lẽ sẽ là đủ tốt. Một nơi nào đó phải có một số loại cờ bản địa mà nói nếu đã có một kết nối thiết lập lại mặc dù? Một sự kiện hay một cái gì đó sẽ thực sự tốt đẹp. – Dervall

+0

@Dervall Ngăn xếp biết liệu đã được đặt lại hay chưa, nhưng tôi chưa bao giờ thấy một API TCP trong cuộc đời của tôi sẽ cung cấp cho bạn. Bạn phải làm I/O trên kết nối TCP để nhận lỗi. Nó thực sự được thiết kế theo cách đó: 'không có âm quay số'. Được xây dựng để tồn tại các lỗi nút trung gian và định tuyến lại. – EJP

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