2013-07-23 36 views
5

Tôi đang cố gắng phát hiện bất cứ khi nào máy khách bị ngắt kết nối với chức năng select(). Vấn đề là, tôi không hiểu nhiều về cách select() hoạt động. Tôi đang sử dụng mã sau đây, bạn có thể cho tôi biết những gì tôi đang làm sai và/hoặc làm thế nào để phát hiện nếu khách hàng bị ngắt kết nối? Tôi đang sử dụng ổ cắm không chặn.Phát hiện bất cứ khi nào ổ cắm bị ngắt kết nối bằng cách chọn()

int Network::bytesAvailable() 
{ 
    long bytes = 0; 

    if(ioctl(this->sockfd, FIONREAD, &bytes) < 0) 
    { 
     printf("ERROR: Network:bytesAvailable: ioctl() call failed.\n"); 
     return -1; 
    } 

    return bytes; 
} 

NetworkStatus Network::status() 
{ 
    struct timeval tv; 
    fd_set fd; 
    int result = 0; 

    tv.tv_sec = 5; 
    tv.tv_usec = 0; 

    FD_ZERO(&fd); 
    FD_SET(this->sockfd, &fd); 

    result = select(this->sockfd + 1, &fd, 0, 0, &tv); 

    if(result && !this->bytesAvailable()) 
    { 
     return -1; // disconnected, I'm guessing this is definitely WRONG. 
    } 
    else if(result > 0 && FD_ISSET(this->sockfd, &fd)) 
    { 
     return 1; // bytes available. 
    } 
    else if(!result) 
    { 
     return 0; // timeout 
    } 

    return -1; // select() call failed. 
} 
+0

Nói chung, chúng tôi phát hiện, Cho dù kết nối có hoạt động không? bằng cách sử dụng 'keepalive' và' select() ', chúng tôi sử dụng cho ghép kênh. Có ** không ** đúng không? –

+0

Tôi không hiểu ngữ pháp của bạn, xin lỗi :) – user2399415

+0

Xin lỗi tiếng Anh của tôi rất kém: (nhưng tôi đã chỉnh sửa nhận xét, bây giờ tôi có hiểu không? –

Trả lời

8

Khi ổ cắm đóng nó trở thành "có thể đọc" nhưng gọi recv sẽ trả về 0 byte. Sử dụng select bạn có thể biết khi nào ổ cắm có thể đọc được khi đọc nó nếu recv trả về 0 thì bạn biết nó đã đóng.

Nhận xét của bạn "byte khả dụng" không chính xác. Các ổ cắm có thể được đọc từ Tuy nhiên, nếu nó được đóng lại sẽ không có byte có sẵn.

else if(result > 0 && FD_ISSET(this->sockfd, &fd)) 
{ 
    return 1; // bytes available. 
} 

Trong socket non-blocking, recv sẽ trở lại -1 và thiết errno-EWOULDBLOCK (hoặc EAGAIN) nếu không có dữ liệu và ổ cắm không được đóng lại.

+0

AFAIK trên ổ cắm không chặn , nó không chính xác, bởi vì recv có thể trả về 0 (chưa có dữ liệu nào được nhận). – user2399415

+0

Kiểm tra chỉnh sửa của tôi về các ổ cắm không chặn. –

+0

Cảm ơn bạn. Đã giải quyết được sự cố. – user2399415

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