2011-10-22 35 views
5

Tôi đang viết thư viện cơ sở dữ liệu sẽ phải hỗ trợ hết thời gian chờ thông minh. Bây giờ tôi đang nhìn vào kết nối tổng hợp, tôi đặc biệt lo lắng về các tình huống sau:Làm thế nào để ngăn chặn các phản hồi trễ tới một ổ cắm TCP?

  1. Gửi Query # 1
  2. Time out sau n giây.
  3. Gửi Query # 2
  4. nhận một phản ứng để truy vấn # 1

Bước bốn có thể xảy ra, bởi vì các truy vấn không được đánh dấu với một ID truy vấn: tất cả tôi biết là tôi đã nhận được một phản ứng, và tôi không biết truy vấn thuộc về nó. Người ta có thể lập luận rằng điều này cấu thành một sai lầm trong giao thức, nhưng điều đó không tùy thuộc vào tôi.

Trước khi gửi truy vấn # 2, tôi nên làm gì với ổ cắm để tránh trả lời muộn như vậy? Là cách chính xác duy nhất để shutdown(), close() và lại connect()?

+2

gì về việc thêm liên tục để các lựa chọn của tất cả các truy vấn để thư viện của bạn có thể xác định được truy vấn trả lời là gì? – T3hc13h

+0

Đó là một ý tưởng tuyệt vời, nhưng đáng buồn là không tốt cho một thư viện. Có thể thông qua một plugin ... –

Trả lời

3

Tôi e rằng đây là cách an toàn duy nhất để vận hành kết nối của bạn, bởi vì không có cách nào khác để có được một cuộc gặp gỡ giữa câu hỏi và câu trả lời qua TCP. Dường như thiếu một số loại hủy chức năng inbetween.

Tham chiếu này cung cấp cho cái nhìn sâu sắc hơn: http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html

+0

Đổi lại, đó là vì TCP không biết gì về "truy vấn", "phản hồi" hoặc "hủy bỏ" của bạn. Một ổ cắm được kết nối chỉ là hai ống một chiều cho các byte (Ted Stevens đã đúng). Nếu người ta kết thúc viết công cụ vào và con lạch không dâng lên, thì đầu kia có thể đọc nó. Vì vậy, việc thiết lập "truy vấn" là "phản hồi" là "cho" là một vấn đề cấp ứng dụng. Hoặc là nó được xây dựng trong giao thức xác định truy vấn/phản hồi, hoặc nó không tồn tại. –

+0

Ý tôi là, tôi biết. :-) Nhưng TCP có số thứ tự, vì vậy tôi đã hy vọng có một số loại lừa tôi có thể tận dụng. –

+0

@Andres: không may là số thứ tự chỉ cho phép lớp TCP tập hợp luồng - không có gì để nói khoảng thời gian trôi qua giữa các byte cụ thể theo các hướng ngược nhau. Hãy nhớ rằng chỉ vì 'n' giây trôi qua kể từ khi bạn gửi yêu cầu đầu tiên, không có nghĩa là' n' giây trôi qua kể từ đầu kia đọc nó. Vì vậy, đầu kia có thể đã gửi phản hồi đó * trước * thời gian chờ từ POV của nó, nhưng nó đến với bạn sau khi hết thời gian chờ từ POV của bạn. Thời gian chờ một mình có thể làm việc với một kết nối đáng tin cậy, thời gian đồng bộ, mà TCP không phải là. –

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