2009-07-08 83 views
12

我的工作使用典型的套接字API在Linux平臺上用C編寫網絡應用++,和我在看寫的2種替代方法一個字節數組到TCP流:通過調用write()或調用send()。我知道,因爲這是Linux,所以套接字句柄只是一個文件描述符,因此在套接字上執行read()和write()調用是有效的,但是套接字API也提供了send()和recv )功能執行相同的任務。性能影響寫入套接字時()

我因此想知道是否有任何特別的理由去選擇一個類的功能比其他 - 被髮送/ recv的功能網絡寫入/讀取優化,做他們表現得更好,等等?或者它真的是任意使用哪些功能?在所有情況下,read()和write()的行爲是否正確?

感謝您的見解!

回答

19

應該沒有差別。從man 2 send引述:

唯一的區別send()write()之間是標誌的存在。零標誌參數send()相當於write()

只要你不想指定和send()標誌就可以使用write()自由。

+0

FreeBSD或其他平臺也是如此嗎? - 該行不會出現在我的send(2)手冊頁中。 – 2014-03-18 23:34:03

+0

@GoodPerson它適用於所有平臺。如果不是這樣,`inetd`之類的將不起作用。 (`inetd`把你的套接字放進你的守護進程的標準輸入和標準輸出中,你的進程可以用正常的方式直接與標準輸入和標準輸出進行交互,而不必知道它們是套接字。當然,你也可以使用套接字。 ) – 2014-11-29 06:43:39

6

recvsend允許您指定的標誌,如出帶外數據包。如果你不需要指定標誌,readwrite就足夠了。

1

write V.S.單個字節的send,或者一個單一的數組可能不會有太大的不同 - 它們很快會結束相同的代碼路徑(最終它們執行相同的操作)。網絡傳輸的開銷極不可能達到這一水平;它將實際的TCP連接並通過電線移動位。

但是,如果您打算一次發送大型多部分消息,則應該查看sendmsg()系統調用 - 這允許您指定要發送的非連續數據數組列表。

在一天結束時,正常的指導原則適用 - 先寫應用程序,然後進行基準測試,看看你的瓶頸在哪裏。