2016-08-23 14 views
7

Tôi có cuộc gọi chặn accept() trong chuỗi đang chờ yêu cầu kết nối. Khi ứng dụng sắp đóng, tôi muốn báo hiệu chuỗi đang chờ trên accept() để thoát khỏi một cách duyên dáng. Tôi đã tìm thấy trong tài liệu cho Winsock rằng tôi có thể đặt giá trị thời gian chờ cho send()recv(), nhưng tôi không thể làm điều đó cho accept().Làm cách nào để thoát khỏi cuộc gọi chặn() trong Windows?

Tôi đã đọc rằng tôi có thể làm cho ổ cắm không bị chặn và sử dụng select() và chuyển giá trị thời gian chờ cho select(), nhưng tôi đang tìm kiếm giải pháp chặn ổ cắm.

+0

AFAIK bạn không thể ... ít nhất không phải trên cửa sổ "cũ hơn" (trước khi đăng nhập). –

+1

Bạn không cần phải chuyển sang chế độ không chặn để sử dụng 'select()', nó cũng có thể được sử dụng để chặn các ổ cắm. Gọi 'select()' với timeout, và không gọi 'accept()' trừ khi 'select()' cho bạn biết kết nối đang đợi để được chấp nhận. Nếu không, hãy chuyển sang không chặn. Bạn có thể sử dụng 'WSAEventSelect()' với 'WSAWaitForMultipleEvents()' để đợi các sự kiện socket và một sự kiện kết thúc cùng một lúc. Hoặc sử dụng Cổng Hoàn thành I/O cho các sự kiện ổ cắm và đăng sự kiện chấm dứt khi cần. –

+0

CancelSynchronousIo() cũng có thể là một sửa chữa nhanh chóng và dễ dàng. –

Trả lời

1

Tôi đã đọc mà tôi có thể làm cho các ổ cắm non-blocking và sử dụng lựa chọn(), và vượt qua một giá trị thời gian chờ cho select(), nhưng tôi đang tìm kiếm một giải pháp để chặn ổ cắm.

Bạn có thể làm điều này trên chặn ổ cắm:

sock = socket(...); 
bind(sock, ...); 
listen(sock, ...); 

while (program_running()) 
{ 
    timeval timeout = {1, 0}; 
    fd_set fds; 
    FD_ZERO(&fds); 
    FD_SET(sock, &fds); 

    select(sock+1, &fds, NULL, NULL, &timeout); 

    if (FD_ISSET(sock, &fds)) 
    { 
     client = accept(sock, ...); 

     // do things with client 
    } 

Từ MSDN accept function documentation:

Các readfds tham số xác định các ổ cắm mà là để được kiểm tra để có thể đọc. Nếu ổ cắm hiện đang ở trạng thái nghe, nó sẽ được đánh dấu là có thể đọc được nếu một yêu cầu kết nối đến đã được nhận sao cho việc chấp nhận được đảm bảo hoàn thành mà không chặn.

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