當前位置:編程學習大全網 - 編程語言 - linux手冊翻譯——send(2)

linux手冊翻譯——send(2)

send, sendto, sendmsg - send a message on a socket

系統調用 send()、sendto() 和 sendmsg() 用於將消息傳輸到另壹個套接字。

僅當套接字處於連接狀態時才可以使用 send() 調用(以便知道預期的接收者, 也就是說send()僅僅用於數據流類型的數據發送 ,對於TCP,服務端和客戶端都可以使用send/recv;但是對於UDP,只能是客戶端使用send/recv,服務端只能使用sendto/recvfrom,因為客戶端是進行了connect操作知道要發送和接受的地址)。send() 和 write(2) 之間的唯壹區別是存在 flags 參數。此外,

send(sockfd, buf, len, flags);

等價於

sendto(sockfd, buf, len, flags, NULL, 0);

參數 sockfd 是發送者套接字的文件描述符。

如果在連接模式的套接字(即套接字類型為SOCK_STREAM、SOCK_SEQPACKET)上使用 sendto(),則參數 dest_addr 和 addrlen 將被忽略(當它們不是NULL和0時可能返回錯誤EISCONN),若套接字沒有實際連接(還沒有三次握手建立連接)將返回錯誤ENOTCONN。 否則,目標地址由 dest_addr 給出, addrlen 指定其大小。 對於 sendmsg(),目標地址由 msg.msg_name 給出, msg.msg_namelen 指定其大小。

對於 send() 和 sendto(),消息位於 buf 中,長度為 len 。 對於sendmsg(),消息存放於 msg.msg_iov 元素指向 數組數據區 (見下)中。 sendmsg() 調用還允許發送輔助數據(也稱為控制信息)

如果消息太長而無法通過底層協議原子傳遞( too long to pass atomically through the underlying protocol ),則返回錯誤 EMSGSIZE,並且不會傳輸消息。

No indication of failure to deliver is implicit in a send(). Locally detected errors are indicated by a return value of -1.

當消息不適合套接字的發送緩沖區時,send() 通常會阻塞,除非套接字已置於非阻塞 I/O 模式。 在這種情況下,在非阻塞模式下它會失敗並顯示錯誤 EAGAIN 或 EWOULDBLOCK。 select(2) 調用可用於確定何時可以發送更多數據

上面的的描述還是很籠統的,以TCP為例,按我的理解,我認為只要發送緩沖區有空閑位置,且此時協議棧沒有向網絡發送數據,那麽就可以寫入,對於阻塞模式,直到所有數據寫入到緩沖區,就會返回,否則壹直阻塞,對於非阻塞模式,是有壹個超時時間的,這個由 SO_SNDTIMEO 選項控制,詳細見 socket(7) ,如果當前有空閑位置可以發即當前可寫入,那麽就寫入到緩沖區,知道超時之前寫入多少算多少,然後返回成功寫入的字節數,如果超時時任何數據都沒寫出去,或者當前就是不可寫入,那麽返回-1 ,並設置errno為 EAGAIN 或 EWOULDBLOCK。

The flags argument is the bitwise OR of zero or more of the following flags.

sendmsg() 使用的 msghdr 結構的定義如下:

對於未連接的套接字 msg_name 指定數據報的目標地址,它指向壹個包含地址的緩沖區; msg_namelen 字段應設置為地址的大小。 對於連接的套接字,這些字段應分別指定為 NULL 和 0。 這裏的未連接指的是數據報協議,連接指的是數據流協議

The msg_iov and msg_iovlen fields specify scatter-gather locations, as for writev(2).

msg_iov是壹個buffer數組:

使用 msg_control 和 msg_controllen 成員發送控制信息(輔助數據)。 內核可以處理的每個套接字最大控制緩沖區長度由 /proc/sys/net/core/optmem_max 中的值限制; 見 socket(7) 。 有關在各種套接字域中使用輔助數據的更多信息,請參閱 unix(7) 和 ip(7)。

msg_flags 字段被忽略。

成功時,返回成功發送的字節數,這個字節數並不壹定和我們的緩沖區大小相同 。 出錯時,返回 -1,並設置 errno 以指示錯誤。

這些是套接字層生成的壹些標準錯誤。 底層協議模塊可能會產生和返回額外的錯誤; 請參閱它們各自的手冊頁。

4.4BSD, SVr4, POSIX.1-2001. These interfaces first appeared in 4.2BSD.

POSIX.1-2001 describes only the MSG_OOB and MSG_EOR flags. POSIX.1-2008 adds a specification of MSG_NOSIGNAL. The MSG_CONFIRM flag is a Linux extension.

根據 POSIX.1-2001,msghdr 結構的 msg_controllen 字段應該是 socklen_t 類型,而 msg_iovlen 字段應該是 int 類型,但是 glibc 目前將兩者都視為 size_t。

有關可用於在單個調用中傳輸多個數據報的 Linux 特定系統調用的信息,請參閱 sendmmsg(2)。

Linux may return EPIPE instead of ENOTCONN.

getaddrinfo(3) 中顯示了使用 send() 的示例。

  • 上一篇:在計算機系統中的接口主要有
  • 下一篇:阿蘭圖靈簡介
  • copyright 2024編程學習大全網