2009-04-01 34 views
8

Tình huống: Máy chủ gọi chấp nhận(). Máy khách gửi một SYN đến máy chủ. Máy chủ nhận SYN và sau đó gửi một SYN/ACK trở lại máy khách. Tuy nhiên, máy khách hiện đang treo/chết, vì vậy nó không bao giờ gửi một ACK trở lại máy chủ.Ổ cắm TCP và POSIX chấp nhận() ngữ nghĩa

Điều gì sẽ xảy ra? Có chấp nhận() trả lại ngay sau khi nó nhận được SYN hay không cho đến khi ACK của khách hàng được trả về? Nếu nó chặn, nó cuối cùng đã hết thời gian?

Trả lời

9

Cuộc gọi đến accept() khối cho đến khi có kết nối. Trừ khi và cho đến khi bắt tay 3 chiều hoàn thành, có không có kết nối, do đó, accept() không được trả lại. Đối với các ổ cắm không chặn, nó sẽ không chặn, nhưng nó cũng sẽ không cung cấp cho bạn thông tin về những cái bắt tay được hoàn thành một phần.

1

Cuối cùng nó sẽ hết thời gian, vì kịch bản đó thực tế phải đối mặt với DoS (Từ chối dịch vụ) và tài nguyên cho chấp nhận được trả về để sử dụng bởi hệ điều hành. nếu có thể khiến ổ cắm chính bị chặn, vì máy khách được kết nối với máy chủ khi chấp nhận trả về với bộ phân tách hợp lệ của tệp

Trong trường hợp xảy ra lỗi trong khi kết nối từ máy khách, giá trị errno sẽ được đặt và một ý tưởng hay là đăng nhập hoặc hiển thị thông báo lỗi. Tuy nhiên, đọc các trang người đàn ông nó là nguồn thông tin tốt nhất trong hầu hết các trường hợp.

2

Nếu khách hàng không bao giờ gửi ACK, accept() sẽ chặn hoặc trả lại EAGAIN nếu ổ cắm được đánh dấu là không chặn.

0

Trong trường hợp có lỗi, nói rằng, một thời gian chờ vì một cái bắt tay không hoàn thành, nó sẽ trả về -1 và đặt errno. Tôi tin rằng, sau khi nhìn vào trang người đàn ông, nó sẽ đặt errno thành ECONNABORTED.

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