2012-12-26 30 views
5

Có một giai đoạn pha trộn nền tảng thời gian chờ để chấp nhận ứng dụng bằng cách sử dụng chức năng accept mà không cần thiết lập ổ cắm để không chặn không?Làm thế nào để chấp nhận socket với thời gian chờ

Tôi biết rằng tôi nên sử dụng chức năng select cho nó, nhưng những gì tôi đang làm sai?

SOCKET NativesAcceptClient(SOCKET s, int timeout) 
{ 
    int iResult; 
    struct timeval tv; 
    fd_set rfds; 
    FD_ZERO(&rfds); 
    FD_SET(s, &rfds); 

    tv.tv_sec = (long)timeout; 
    tv.tv_usec = 0; 

    iResult = select(s, &rfds, (fd_set *) 0, (fd_set *) 0, &tv); 
    if(iResult > 0) 
    { 
     return accept(s, NULL, NULL); 
    } 
    else 
    { 
    //always here, even if i connect from another application 
    } 
    return 0; 
} 

Cách khắc phục điều đó? Cảm ơn!

+0

@ryanbwork no, timeout is 10 – Boris

+0

Xem giải pháp dưới đây của tôi? – ryanbwork

+1

là nó ngay lập tức bật ra khỏi lựa chọn hoặc là nó chờ đợi 10s trước khi bật ra (nếu bạn không kết nối với nó)? có vẻ ok (ngoài các s + 1 được đề cập cho các nền tảng không phải Windows), một cái gì đó khác là không ... – mark

Trả lời

2

Thông số đầu tiên của cuộc gọi select phải bằng với bộ mô tả tệp số cao nhất trong tập hợp fd_set của bạn cộng 1 (xem here). Hãy thử thay đổi đối số đầu tiên thành s+1; bạn sẽ cần phải thêm một số logic khi bạn có nhiều hơn một ổ cắm trong bộ của bạn.

+0

Cảm ơn, nhưng bây giờ tôi đang thử nghiệm trên Windows, vì tôi biết thông số đầu tiên bị bỏ qua trên cửa sổ – Boris

+0

Bạn có thể đảm bảo rằng kết nối đến của bạn đang diễn ra trong cửa sổ 10 giây không? – ryanbwork

0

Đối số đầu tiên của select() là một int ít nhất là 1 lớn hơn so với giá trị cao nhất của các bộ mô tả tệp trong bất kỳ bitets nào. Trong trường hợp này,

iResult = select(s + 1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv); 

sẽ hoạt động.

1

select() trả về> 0 nếu ổ cắm được báo hiệu, 0 trên thời gian chờ và -1 do lỗi. Giá trị nào là select() thực sự quay lại với bạn? Bạn chỉ kiểm tra> 0 và < = 0, có nghĩa là bạn không phân biệt giữa -1 và 0. Nếu nó trở về 0 thì không có máy khách nào kết nối với ổ cắm của bạn, nhưng nếu nó trở về -1 thì ổ cắm của bạn có khả năng không hợp lệ để bắt đầu.

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