2009-05-26 33 views

Trả lời

1

Tôi biết một lỗi trong một hành máy tính để bàn phổ biến nơi O_NONBLOCK TCP socket, đặc biệt là những người đang chạy trên giao diện loopback, đôi khi có thể trở lại EAGAIN từ recv() sau select() báo cáo ổ cắm sẵn sàng để đọc. Trong trường hợp của tôi, điều này xảy ra sau khi nửa bên kia đóng một nửa luồng gửi.

Để biết thêm chi tiết, hãy xem mã nguồn cho t_nx.ml trong thư viện NX của phân phối Môi trường ứng dụng mạng OCaml của tôi. (link)

+1

Liên kết dường như bị hỏng – Thomas

+0

Vui nhộn, trong trình đơn chỉnh sửa, có thể nhấp. : D – thejh

2

Có thể, nhưng chỉ trong một tình huống mà bạn có nhiều luồng/quy trình cố đọc từ cùng một socket.

+0

Vui mừng khi nghe điều đó. Ứng dụng của tôi là đơn luồng nên tôi ổn. – mrvincenzo

4

Đối với recv() bạn sẽ nhận được EAGAIN thay vì EWOULDBLOCK và có thể thực hiện được. Kể từ khi bạn vừa kiểm tra với select() sau đó một trong hai điều xảy ra:

  • Cái gì khác (một thread) đã cạn kiệt bộ đệm đầu vào giữa select()recv().
  • Thời gian chờ nhận được đặt trên ổ cắm và thời gian chờ đã hết mà không nhận được dữ liệu.
+0

Trong trường hợp hết thời gian chờ, chọn() trả về 0 để tôi không lo lắng về điều đó. – mrvincenzo

+3

#define EWOULDBLOCK EAGAIN/* Thao tác sẽ chặn */- tìm thấy trên nhiều hệ điều hành – blaze

+0

POSIX.1-2001 cho phép lỗi được trả lại khi đọc trên ổ cắm không chặn (và không yêu cầu chúng có cùng Giá trị.) –

0

Có thể trong môi trường đa luồng có hai chuỗi đang đọc từ ổ cắm. Đây có phải là ứng dụng đa luồng không?

+0

Đây là một ứng dụng đơn luồng. – mrvincenzo

+0

Thậm chí nếu có một thời gian chờ trên socket thay vì chỉ là một tham số để 'select()'? Nếu thời gian chờ xảy ra giữa 'select()' và 'recv()' thì sao? – dwc

+0

Trong trường hợp này, bạn sẽ không thấy hành vi này. – mikelong

0

Nếu bạn không gọi bất kỳ syscall nào khác giữa select() và recv() trên socket này, thì recv() sẽ không bao giờ trả về EAGAIN hoặc EWOULDBLOCK.

Tôi không biết ý nghĩa của chúng với thời gian chờ rút lại, tuy nhiên, tiêu chuẩn POSIX không đề cập đến nó ở đây để bạn có thể gọi recv an toàn().

0

Mặc dù ứng dụng của tôi là một ứng dụng đơn luồng, tôi nhận thấy rằng hành vi được mô tả không phải là hiếm trong RHEL5. Cả hai với các cổng TCP và UDP được đặt thành O_NONBLOCK (tùy chọn socket duy nhất được thiết lập). select() báo cáo rằng socket đã sẵn sàng nhưng recv() trả về EAGAIN.

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