2010-03-10 35 views
22

Tôi biết rằng read() là một cuộc gọi chặn trừ khi tôi làm cho ổ cắm không bị chặn. Vì vậy, tôi mong đợi read() gọi mà yêu cầu 4K dữ liệu nên trả lại một giá trị tích cực (không có byte đọc) hoặc -1 trên lỗi (có thể kết nối thiết lập lại của khách hàng vv). Câu hỏi của tôi là: Có thể đọc() trả về '0' vào bất kỳ dịp nào không?Có thể đọc() chức năng trên một ổ cắm kết nối trả lại byte không?

Tôi đang xử lý read() theo cách này:

if ((readval = read(acceptfd, buf, sizeof(buf) - 1)) < 0) 
    { 

    } 
    else 
    { 
     buf[readval] = 0; 
     //Do some thing with data 
    } 

Mã này quả bom nếu đọc() trả về zero và tôi biết làm thế nào để sửa chữa nó. Nhưng có thể đọc() để trả về không?

+0

Bạn đã xem xét việc đọc trang * man * chưa? – EJP

Trả lời

41

Khi kết nối TCP được đóng trên một mặt đọc() ở phía bên kia trả về 0 byte.

+3

Không nên trả lại giá trị đọc -1 với errno được đặt thành ECONNRESET? Nó thực sự là một điều kiện lỗi, nếu bên kia đã đóng kết nối. Chúng ta có nên xem xét trở lại của số không cũng như điều kiện lỗi? – kumar

+6

+1 read() trả về số không khi kết nối bị đóng. –

+1

@kumar: trở về số không cho phép bạn xác định rằng một lệnh đóng cửa đã xảy ra, trái ngược với một lỗi thực sự. –

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