2010-03-16 41 views
6

Tôi đã học được ví dụ về cách sử dụng ổ cắm. Trong ví dụ này, một client gửi yêu cầu tới server để mở socket và sau đó server (nghe một cổng cụ thể) mở socket và mọi thứ đều ổn, socket được "mở" từ cả hai phía (client và server).Tôi có thể đóng và mở lại ổ cắm không?

Nhưng tôi vẫn chưa hiểu rõ mức độ linh hoạt của nội dung này. Ví dụ, nó có thể cho khách hàng để đóng một mở (từ cả hai đầu) ổ cắm và mở lại nó một lần nữa (trong điều kiện máy chủ giữ ổ cắm mở).

Máy chủ có thể "biết" rằng một ổ cắm đã được đóng ở phía máy khách không? Có thể cho khách hàng biết rằng một ổ cắm đã được đóng ở phía máy chủ?

thêm: điều quan trọng

Một hơn đối với tôi. Điều gì sẽ xảy ra nếu một ứng dụng (không có máy chủ hoặc máy khách) bị treo, bất thường bị chấm dứt, bị giết? Nó sẽ đóng tất cả các ổ cắm được mở ở phía bên của ứng dụng?

THÊM 2:

gì nếu một ứng dụng trên một mặt của ổ cắm được tắt (giết, đóng cửa, chấm dứt) và sau đó nó được bật lên lần nữa (trên cùng địa chỉ IP và cổng tương tự). Chúng ta có nên tạo một ổ cắm mới giữa hai ứng dụng hoặc chúng ta có thể sử dụng socket cũ (được tạo trước khi xảy ra sự cố).

Trả lời

2

Có thể cho máy chủ "biết" rằng một ổ cắm đã được đóng trên phía máy khách không?

Khi máy chủ cố gắng gửi một số dữ liệu cho khách hàng đó, ngoại lệ tương ứng sẽ bị ném.

Điều quan trọng hơn đối với tôi. Những gì xảy ra nếu một ứng dụng (không có máy chủ máy chủ hoặc khách hàng) bị treo, bất thường chấm dứt, bị giết? Nó sẽ đóng tất cả các khe cắm được mở ở mặt bên của ứng dụng ?

Ngoại lệ được tạo để xử lý các trường hợp bất thường này. Nếu có một màu đen và một khách hàng (hoặc máy chủ) bị tắt thì phía bên kia sẽ nhận được một ngoại lệ ngay sau khi nó cố gắng tương tác với bên bị tắt.

UPD:

gì nếu một ứng dụng trên một mặt của các ổ cắm được tắt (giết, khép kín, chấm dứt) và sau đó nó được bật lại (trên cùng một địa chỉ IP và cùng một cổng). Nếu chúng tôi tạo một ổ cắm mới giữa hai ứng dụng hoặc chúng tôi có thể sử dụng ổ cắm cũ (được tạo trước khi xảy ra sự cố).

Tạo ổ cắm mới.

9

Ổ cắm có thể được sử dụng cho rất nhiều thứ mà câu trả lời cho những câu hỏi này sẽ thay đổi, nhưng tôi cho rằng bạn đang nói về TCP.

Ví dụ: có thể cho khách hàng đóng một ổ cắm đã mở (từ cả hai đầu) và mở lại nó (trong điều kiện máy chủ giữ ổ cắm mở).

Không, vì TCP sẽ thực hiện lời tạm biệt và bạn không thể nhận lại kết nối từ đó. Bạn sẽ phải bắt tay lại ba chiều và bắt đầu một kết nối hoàn toàn mới.

Máy chủ có thể "biết" rằng một ổ cắm đã được đóng ở phía máy khách không? Có thể cho khách hàng biết rằng một ổ cắm đã được đóng ở phía máy chủ?

Yes. TCP có thể gửi một gói tạm biệt hoặc một bên có thể hết thời gian và hoàn toàn có thể phát hiện các tình huống này trong cả hai trường hợp.

+0

Tôi không hiểu quy trình. Ví dụ, client đóng socket và server không làm điều đó. Khách hàng cố gắng mở một ổ cắm mới (từ cùng một cổng và địa chỉ IP) nhưng máy chủ nói: xin lỗi là không thể vì ổ cắm này đã tồn tại! Và sau đó khách hàng nói: tốt nó tồn tại cho bạn, nhưng tôi đóng nó và tôi không thể mở lại nó một lần nữa! – Roman

+0

Máy chủ sẽ xử lý ổ cắm trong các chủ đề khác nhau. Nó không phải là một vấn đề để mở (ví dụ: chấp nhận) ổ cắm trên cùng một cổng. – Roman

+0

ah, thật là một mớ hỗn độn xấu xí với biệt hiệu. – Roman

2

Q1-> Máy chủ có thể "biết" rằng một ổ cắm đã được đóng ở phía máy khách không? Có thể cho khách hàng biết rằng một ổ cắm đã được đóng ở phía máy chủ?

A1 -> Máy chủ sẽ biết, nếu khách hàng đóng socket và ngược lại. Trên thực tế FIN sẽ được gửi từ cuối, đang bắt đầu đóng kết nối.

Q2-> Điều gì xảy ra nếu ứng dụng ở một bên của ổ cắm bị tắt (bị đóng, đóng, kết thúc) và sau đó nó được bật lại (trên cùng địa chỉ IP và cùng một cổng). Chúng ta có nên tạo một socket mới giữa hai ứng dụng hoặc chúng ta có thể sử dụng socket cũ (được tạo trước khi sự cố).

A2-> Nếu ổ cắm được tạo ra, số fd được gắn với cổng ip-addr &, vì vậy ổ cắm trên phía máy chủ có server-ip & một số cảng và ổ cắm về phía khách hàng có client-ip & một số cổng. nếu xảy ra sự cố tại máy khách, tất cả fd sẽ được giải phóng và không thể sử dụng lại. Nếu chúng ta sử dụng cùng một fd, hệ thống sẽ xử lý nó như là tệp fd bình thường.

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