2009-01-13 43 views
7

Tôi có ba ứng dụng nói chuyện với nhau bằng cách sử dụng ổ cắm. Tất cả họ đều có thể sống trên máy của mình nhưng họ cũng có thể dùng chung máy. Ngay bây giờ tôi đang có hai trong số họ trên cùng và thứ ba trên máy tính của mình. Tôi đang cố gắng để làm cho thông tin liên lạc bullet của tôi bằng chứng vì vậy tôi rút cáp và giết các ứng dụng để đảm bảo tất cả mọi thứ hoạt động như dự định.Điều gì sẽ xảy ra với ổ cắm khi tôi rút cáp mạng?

Dưới đây là một phác thảo nhanh chóng của các điều:

alt text http://i40.tinypic.com/9vch86.png

Bây giờ, khi tôi tháo cáp mạng để PC2 (kết nối đỏ "Côn B"), kết nối nội bộ ngừng nói chuyện (kết nối màu xanh "Con A"). Tôi gửi nội dung từ "Ứng dụng 1" trên ổ cắm không bao giờ được đưa vào "Ứng dụng 2".

Tôi đã thực hiện một cơ chế phát hiện ra điều này và ngắt kết nối rồi kết nối lại và sau đó tôi có thể tháo cáp tất cả những gì tôi muốn và "Con A" chỉ hoạt động. Đó chỉ là lần đầu tiên.

Tôi đã xác nhận có liên lạc qua "Con A" trước khi ngắt kết nối "Con B".
Tôi kết nối và kết nối lại chính xác theo cùng một cách, đó là cùng một mã, vì vậy không có sự khác biệt.

Điều gì đang xảy ra?

Thông tin bổ sung được tìm kiếm theo câu trả lời: PC 1 và PC 2 chia sẻ địa chỉ xuống byte cuối cùng.
Tôi có cơ chế lưu giữ nội bộ, tôi gửi tin nhắn và mong đợi phản hồi cứ 10 giây một lần.
Khi tôi giết ứng dụng 3, điều này không xảy ra, chỉ khi rút cáp.

Trả lời

5

Bạn đang sử dụng địa chỉ nào cho "Con A"? Nếu bạn đang sử dụng một địa chỉ bị ràng buộc với bộ điều hợp mạng bên ngoài, ngay cả khi bạn đang nói chuyện với cùng một máy, thì những gì bạn mô tả có thể xảy ra.

Những gì bạn có thể làm là sử dụng địa chỉ localhost (127.0.0.1) cho "Con A", hoàn toàn độc lập với những gì xảy ra trên mạng bên ngoài.

5

Trên một số nền tảng (cửa sổ) kéo cáp mạng yêu cầu ngăn xếp mạng hoạt động vô hiệu các kết nối ổ cắm mở được liên kết với giao diện.

Trong trường hợp này kéo cáp mạng thực sự là một thử nghiệm xấu vì nó cung cấp phản hồi tích cực cho ứng dụng của bạn mà nó có thể không nhận được trong tình huống thực tế.

Một lỗi phổ biến để mọi người thực hiện khi viết ứng dụng máy khách/máy chủ là không kết hợp một lớp ứng dụng giữ nguyên hoặc ít nhất là cho phép keepalives ở lớp truyền tải. Một ứng dụng recv() ing dữ liệu nếu không có thể được vĩnh viễn không biết đến bất kỳ điều kiện thất bại cho đến khi nó viết() s và ghi không thành công do thời gian chờ lớp vận chuyển.

2

Kéo cáp mạng có các hiệu ứng khác nhau tùy thuộc vào hệ điều hành bạn đang chạy. Như một poster khác cho biết, Windows phát hiện nó và vô hiệu hóa bất kỳ kết nối hiện có nào. Ứng dụng của bạn sẽ nhận được thông báo đóng kết nối trong trường hợp đó.

Máy chủ Linux của tôi giao dịch với nó khá duyên dáng. Sau một ngày mở rộng (30-40 giây), việc kết nối SSH từ máy tính xách tay của tôi đến máy chủ vẫn sẵn sàng và đáp ứng một cách vui vẻ.

Miễn là cáp không được rút phích cắm dài hơn thời gian chờ TCP, ngăn xếp sẽ có thể lưu các gói dữ liệu và truyền lại chúng càng sớm càng tốt. TCP được thiết kế cho điều đó. Nếu bạn không sử dụng TCP thì các gói sẽ rơi ra khỏi lỗ Ethernet và bay hơi vào bầu khí quyển.

@einstein: Nếu bạn đang sử dụng select() hoặc các dẫn xuất, nó trả tiền để không bao giờ chọn với thời gian chờ NULL. Luôn có thời gian chờ hợp lý và kiểm tra trạng thái ổ cắm nếu hết hạn.

+1

Thật không may điều này sẽ không giúp bạn tiết kiệm không bao giờ được thông báo nếu bạn chỉ đang chờ dữ liệu. Nếu không có một keepalive có thể không có thông báo OOB của peer peer-socket tình trạng không thể được sử dụng để phát hiện một điều kiện thất bại mà không cần gửi đầu tiên() ing một cái gì đó. Đây là lý do tại sao keepalives là soo quan trọng. – Einstein

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