2009-11-24 121 views

回答

90

唯一的區別是recv/send允許您爲實際操作指定某些選項。讀/寫是'通用'文件描述符函數,而recv/send稍微更專用(例如,可以設置一個標誌來忽略SIGPIPE或發送帶外消息...)。

+1

這是不正確的,在0長度的數據報的情況下還有一個區別 - 如果一個零長度的數據報未決,請閱讀(2)和recv()零標誌 提供不同的行爲。在這種情況下, read(2)不起作用(數據報保持未決),而recv() 消耗未決的數據報。 – 2017-02-11 08:44:16

+0

@AbhinavGauniyal如何提供不同的行爲_?如果有一個0字節的數據報,'recv'和'read'都不會向調用者提供數據,但也沒有錯誤。對於調用者來說,行爲是一樣的。調用者可能甚至不知道關於數據報的任何事情(它可能不知道這是一個套接字而不是一個文件,它可能不知道這是一個數據報套接字而不是一個流套接字)。數據報保持懸而未決是關於IP堆棧如何在內核中工作以及調用者不可見的隱含知識。從來電角度來看,他們仍然會提供平等的行爲。 – Mecki 2017-07-19 16:51:20

+1

@Mecki這不是每個人的隱性知識,以我爲例:) – 2017-07-20 12:12:32

3

「性能和速度」?這不是那種......同義詞嗎?

無論如何,recv()調用需要標記read()沒有,這使得它更強大,或者至少更方便。這是一個區別。我不認爲有顯着的性能差異,但沒有經過測試。

+11

也許不必處理國旗可能會更方便。 – semaj 2009-11-24 16:16:08

67

the first hit on Google

讀()等效於的recv()爲0的標誌參數的其它值的標誌參數改變的recv的()的行爲。同樣,write()相當於send()的標誌== 0。

+22

這不是整個故事。 'recv'只能在套接字上使用,並且如果試圖在'STDIN_FILENO'上使用它,則會產生錯誤。 – 2011-07-31 05:29:12

+55

此線程現在是Google上的第一次打擊,Google喜歡stackoverflow – Eloff 2013-01-08 21:14:14

8

read()write()更通用,它們可以處理任何文件描述符。 但是,它們不適用於Windows。

您可以將其他選項傳遞給send()recv(),因此您可能必須在某些情況下使用它們。

6

我剛剛注意到,當我在Windows套接字使用write(),它幾乎將工作(FD傳遞給write()是不一樣的一個傳遞到send();我用_open_osfhandle()獲得FD傳遞給write())。但是,當我嘗試發送包含字符10的二進制數據時,它不起作用。write()某處插入字符13之前。使用flags參數0將其更改爲send()可解決該問題。如果13-10在二進制數據中是連續的,那麼read()可能會出現相反的問題,但我沒有對它進行測試。但這似乎是send()write()之間的另一個可能的差異。

+1

+1。另請參見[winsock不支持讀/寫](http://stackoverflow.com/q/4778043) – 2014-06-19 15:14:21

4

另一件事上linux是:

send不允許對非套接字fd操作。因此,例如寫在USB端口上,write是必要的。

相關問題