2010-08-09 42 views
6

Tôi có một ứng dụng máy chủ dựa trên Winsock sử dụng các Cổng Hoàn thành I/O Windows Winsock.Winsock - ngừng chấp nhận các kết nối mới nhưng vẫn giữ kết nối với các kết nối hiện có

Như vậy, mỗi kết nối được chấp nhận được kết hợp với ổ cắm nghe để bắt đầu nhận thông báo (đọc, viết, đóng vv ').
Ổ cắm nghe có tình trạng tồn đọng của 100 kết nối đang chờ xử lý.
Tất cả đều tốt.

Tại một thời điểm nào đó, tôi muốn ngừng chấp nhận kết nối mới nhưng vẫn giữ liên lạc với các ổ cắm đã kết nối hiện có đã kết nối.

I figured tôi có thể làm một trong số:

  1. Dừng gọi WSAAccept().
  2. Đặt tình trạng tồn đọng về 0, có hiệu quả không cho phép bất kỳ kết nối nào tới pend.
  3. Tắt máy gọi() & closesocket() trên ổ cắm nghe.

Hiện tại, tùy chọn # 1 cho kết quả mong đợi; Ứng dụng của tôi không xử lý các kết nối mới, NHƯNG nó chấp nhận lên đến số tiền tồn đọng (100). Kết nối được thực tế thực hiện - Tôi không muốn nó!

Tùy chọn # 2; Tôi có thể làm điều đó? Làm sao? Không thể tìm thấy trên MSDN cũng không phải google. Tài liệu của listen() tại MSDN cho biết;

Nếu nghe hàm được gọi vào một ổ cắm đã nghe, nó sẽ trở thành công mà không cần thay đổi giá trị cho tham số tồn đọng. Đặt thông số backlog thành 0 trong cuộc gọi tiếp theo để nghe trên ổ cắm nghe không được coi là thiết lập lại thích hợp, đặc biệt nếu có kết nối trên ổ cắm.

Không tốt cho tôi.
Nếu tôi có thể làm như vậy một cách an toàn, tôi sẽ kết hợp nó với tùy chọn # 1, thực sự dừng thiết lập bất kỳ kết nối mới nào trên máy (thông qua cổng nghe!).

Tùy chọn # 3 thực sự hoạt động; Sau khi đóng ổ cắm nghe, tôi vẫn có thể giao tiếp với các kết nối hiện có và backlog đã biến mất (tốt, đóng ổ cắm nghe!).

Quan ngại của tôi là cách tiếp cận này có thể có một số tác dụng phụ. Có ai xác nhận không?

Trả lời

8

Bạn chỉ cần đóng khe cắm nghe. Các kết nối được chấp nhận có ổ cắm riêng của chúng và chúng sẽ không bị ảnh hưởng bởi việc đóng ổ cắm nghe.

Ví dụ: trong tài liệu của Microsoft có a sample server application nơi sử dụng socket cơ bản. Có các khe cắm nghe được đóng lại trước khi truyền thông qua các ổ cắm được chấp nhận được thực hiện (trước khi làm-while-loop).

+0

Đúng, # 3 là câu trả lời đúng. –

+0

Câu trả lời hay!"Bằng chứng" là chính xác những gì tôi cần cho sự an tâm !! Hãy xem, tôi sợ sự liên kết của conn mới được chấp nhận với ổ cắm nghe IOCP sẽ tạo ra một số phụ thuộc. Cám ơn bạn một lần nữa! – Poni

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