sự khác nhau giữa read() và recv(), và giữa send() và write() trong lập trình socket là gì? hiệu suất và tốc độ và hành vi khác.Sự khác nhau giữa read() và recv(), và giữa send() và write() là gì?
Trả lời
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 ...).
Đ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ý. –
@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
@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ụ :) –
"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ó.
Có lẽ không phải đối phó với cờ có thể được coi là thuận tiện hơn. – semaj
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.
Đâ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'. –
Chủ đề này hiện là hit đầu tiên trên Google, Google yêu stackoverflow – Eloff
read()
và 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()
và recv()
, vì vậy bạn có thể phải sử dụng chúng trong một số trường hợp.
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()
và write()
.
+1. Xem thêm [winsock không hỗ trợ đọc/ghi] (http://stackoverflow.com/q/4778043) –
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.
- 1. PowerShell: Sự khác nhau giữa 1234 và (1234) là gì?
- 2. Sự khác nhau giữa WPF và WinForms là gì?
- 3. Sự khác nhau giữa JavaScript và Java là gì?
- 4. Sự khác nhau giữa ODBC và OleDB là gì?
- 5. Sự khác nhau giữa SGML và XML là gì?
- 6. Sự khác nhau giữa DefaultSelenium và RemoteWebDriver là gì?
- 7. Sự khác nhau giữa RMI và Corba là gì?
- 8. Sự khác nhau giữa scgi và wsgi là gì?
- 9. Sự khác nhau giữa wsHttpBinding và ws2007HttpBinding là gì?
- 10. Sự khác nhau giữa Pingback và Trackback là gì?
- 11. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 12. Sự khác nhau giữa AxInterop và Interop là gì?
- 13. Sự khác nhau giữa CellClick và CellMouseClick là gì?
- 14. Sự khác nhau giữa .bashrc, .bash_profile và .environment là gì?
- 15. Sự khác nhau giữa JSP và Facelets là gì?
- 16. Sự khác nhau giữa hg quên và hg là gì?
- 17. Sự khác nhau giữa GDI và GDI + là gì?
- 18. Sự khác nhau giữa đá quý và plugin là gì?
- 19. Sự khác nhau giữa metaClass.methods và metaClass.metaMethods là gì?
- 20. Sự khác nhau giữa kEND và $ end là gì?
- 21. Sự khác nhau giữa java và jsp là gì?
- 22. Sự khác nhau giữa Application.Run() và Form.ShowDialog() là gì?
- 23. Sự khác nhau giữa -0 và 0 là gì?
- 24. Sự khác nhau giữa HTTP 1.0 và 1.1 là gì?
- 25. Sự khác nhau giữa java.lang.Math và java.lang.StrictMath là gì?
- 26. Sự khác nhau giữa " " và "" là gì?
- 27. Sự khác nhau giữa Spring BeanFactoryAware và ApplicationContextAware là gì?
- 28. sự khác nhau giữa SCRIPT_FILENAME và SCRIPT_NAME là gì?
- 29. Sự khác nhau giữa JSP và JSTL là gì?
- 30. Sự khác nhau giữa JSF và Facelets là gì?
Hãy nghĩ viết như được thực hiện như sau: '#define write (...) gửi (## __ VA_ARGS__, 0)'. – carefulnow1