2009-11-24 36 views

Trả lời

90

Sự khác biệt duy nhất là recv/send cho phép bạn chỉ định các tùy chọn nhất định cho hoạt động thực tế. đọc/ghi là các chức năng mô tả tập tin 'phổ quát' trong khi recv/send hơi chuyên sâu hơn (ví dụ, bạn có thể đặt cờ để bỏ qua SIGPIPE, hoặc gửi các thông báo ngoài băng tần ...).

+1

Điều này là không chính xác, có một sự khác biệt khác trong trường hợp datagrams có độ dài 0 - Nếu một datagram có chiều dài bằng không đang chờ, đọc (2) và recv() với một flags đối số của zero cung cấp hành vi khác nhau. Trong trường hợp này, đọc (2) không có hiệu lực (datagram vẫn đang chờ xử lý), trong khi recv() tiêu thụ datagram đang chờ xử lý. –

+0

@AbhinavGauniyal Làm thế nào để cung cấp _different behavior_?Nếu có một datagram 0 byte, cả hai, 'recv' và' read' sẽ cung cấp không có dữ liệu cho người gọi nhưng cũng không có lỗi. Đối với người gọi, hành vi là như nhau. Người gọi có thể thậm chí không biết gì về datagram (có thể không biết rằng đây là một socket và không phải là một tập tin, nó có thể không biết rằng đây là một ổ cắm datagram và không phải là một socket stream). Rằng datagram vẫn đang chờ xử lý là ngầm kiến ​​thức về cách ngăn xếp IP làm việc trong hạt nhân và không hiển thị cho người gọi. Từ quan điểm người gọi, họ vẫn sẽ cung cấp hành vi bình đẳng. – Mecki

+1

@Mecki đó không phải là kiến ​​thức tiềm ẩn đối với tất cả mọi người, lấy tôi làm ví dụ :) –

3

"Hiệu suất và tốc độ"? Không phải là những loại ... từ đồng nghĩa, ở đây?

Dù sao, cuộc gọi recv() mất cờ read() không làm cho nó mạnh hơn hoặc ít nhất là thuận tiện hơn. Đó là một sự khác biệt. Tôi không nghĩ rằng có một sự khác biệt đáng kể về hiệu suất, nhưng chưa thử nghiệm nó.

+11

Có lẽ không phải đối phó với cờ có thể được coi là thuận tiện hơn. – semaj

67

mỗi the first hit on Google

read() là tương đương với recv() với một tham số cờ của 0. Các giá trị khác cho tham số cờ thay đổi hành vi của recv(). Tương tự, write() tương đương với send() với cờ == 0.

+22

Đây không phải là toàn bộ câu chuyện. 'recv' chỉ có thể được sử dụng trên một socket, và sẽ tạo ra một lỗi nếu bạn cố gắng sử dụng nó trên, nói,' STDIN_FILENO'. –

+55

Chủ đề này hiện là hit đầu tiên trên Google, Google yêu stackoverflow – Eloff

8

read()write() chung chung hơn, chúng hoạt động với bất kỳ bộ mô tả tệp nào. Tuy nhiên, chúng sẽ không hoạt động trên Windows.

Bạn có thể chuyển các tùy chọn bổ sung cho send()recv(), vì vậy bạn có thể phải sử dụng chúng trong một số trường hợp.

6

Tôi chỉ nhận thấy thời gian gần đây khi tôi sử dụng write() trên một ổ cắm trong Windows, nó gần như làm việc (FD truyền cho write() không giống như một truyền cho send(), tôi sử dụng _open_osfhandle() để có được những FD để vượt qua để write()). Tuy nhiên, nó không hoạt động khi tôi cố gắng gửi dữ liệu nhị phân bao gồm ký tự 10. write() ký tự được chèn vào đâu đó 13 trước đó. Thay đổi nó thành send() với tham số cờ 0 cố định vấn đề đó. read() có thể có vấn đề ngược lại nếu 13-10 là liên tiếp trong dữ liệu nhị phân, nhưng tôi đã không thử nghiệm nó. Nhưng dường như có một sự khác biệt có thể có khác giữa send()write().

+1

+1. Xem thêm [winsock không hỗ trợ đọc/ghi] (http://stackoverflow.com/q/4778043) –

4

Một điều trên linux là:

send không cho phép hoạt động trên phi-socket fd. Vì vậy, ví dụ để viết trên cổng usb, write là cần thiết.

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