2012-09-13 76 views
1

我正在使用ssize_t send(int sockfd, const void *buf, size_t len, int flags);來自socket.h文件。我對此有些懷疑。發送函數如何工作

懷疑1:如果假設我傳遞到send字符串是長度10的和i的第三參數指定的長度爲15。那麼send只會發送10個字符,或者它會發送15個字符(通過讀取最後5個字符的未分配內存來獲取)。
如果第二個參數的長度大於第三個參數,反向情況下會發生什麼意思。

疑問2:我假設第二個參數的長度等於第三個參數。現在如果第二個參數是 - "abc\0def\0qw"。它的長度是11.將send發送整串還是\0都有它的任何作用。我認爲它會發送整個字符串。如何發送作品。

如果有人知道關於send,recv的任何好消息,那麼這些函數將深入討論這些函數。

回答

1

send函數對「字符串」一無所知。如果你給它一個指針,並告訴它發送該指針後面的下一個15個字節,那就是正確的它會嘗試做什麼。 (如果您給它一個不合適的len值,您可能會遇到Seg-Fault或類似的問題)。

沒有理由相信它會因爲它找到一個值爲0x00的字節而停下來。畢竟,很多網絡協議在全國各地都以0x00填充。每次發現該值時都不能有send停止。

1

send不知道任何關於NUL終止的字符串(有參數類型的線索 - 它需要一個void*而不是char*)。

它只是發送你給它的字節數,從你給它的地址。如果這意味着讀取未分配的內存,那麼這就是它會做的,可能會在進程中崩潰。

2
  • 功能send將嘗試發送完全一樣多,因爲你告訴它。如果緩衝區足夠大,沒有什麼特別的事情發生。如果不是,則會發生什麼沒有定義:它可能發送垃圾或它可能會崩潰或可能做任何事

  • 函數send不關心緩衝區內容 - 它只關心指定的字節數寫