SEND(2) | Linux Programmer's Manual | SEND(2) |
send, sendto, sendmsg - 從套接字傳送訊息
#include <sys/types.h>
#include <sys/socket.h>
int send(int s, const void *msg,
size_t len, int flags);
int sendto(int s, const void *msg, size_t
len, int flags, const struct sockaddr
*to, socklen_t tolen);
int sendmsg(int s, const struct msghdr
*msg, int flags);
Send, sendto, 和 sendmsg 用於向另一個套接字傳遞訊息. Send 僅僅用於連線套接字,而 sendto 和 sendmsg 可用於任何情況下.
目標地址用 to 指定, tolen 定義其長度.訊息的長度用 len 指定. 如果訊息太長不能透過下層協議,函式將返回 EMSGSIZE 錯誤,訊息也不會被送出.
在資料傳送過程中所產生的錯誤不會返回給 send. 如果發生本地錯誤,則返回-1.
當要傳送的訊息長度大於套接字當前可用緩衝區時, send 將阻塞,除非在套接字上設定了非阻塞式輸入輸出模式. 對於非阻塞模式,這種情況下將返回 EAGAIN 錯誤. The 系統呼叫 select(2) 可以用來檢測何時可以傳送更多的資料.
引數 flags 是一個標誌字,可以包含下列標誌:
結構體 msghdr 的定義如下.詳情參見 recv(2) 和下文.
struct msghdr { void * msg_name; /*地址選項*/ socklen_t msg_namelen; /*地址長度*/ struct iovec * msg_iov; /*訊息陣列*/ size_t msg_iovlen; /*msg_iov中的元素個數*/ void * msg_control; /*輔助資訊,見下文*/ socklen_t msg_controllen; /*輔助資料緩衝區長度*/ int msg_flags; /*接收訊息標誌*/ };
可以使用 msg_control 和 msg_controllen 成員傳送任何控制資訊.核心所能處理的最大控制訊息緩衝區長度由 net.core.optmem_max sysctl對每個套接字進行限定;參見 socket(7).
成功時返回傳送的字元個數,否則返回-1.
其中一些是套接字層產生的標準錯誤.其他的是下層協議模組產生的;參見 各自的man手冊.
4.4BSD,SVr4,POSIX1003.1g草案(這些系統呼叫首次出現於4.2BSD). MSG_CONFIRM 是Linux所做的擴充套件.
上面給出的函式原型遵循Single Unix Specification, glibc2也是這麼做的; flags 引數在BSD4.*中是`int',但在libc4和libc5中是`unsigned int'; 引數 len 在BSD4.*和libc4中是`int',但在libc5中是'size_t'; 引數 tolen 在BSD4.*,libc4和libc5中都是`int'. 參見 accept(2).
fcntl(2), recv(2), select(2), getsockopt(2), sendfile(2), socket(2), write(2), socket(7), ip(7), tcp(7), udp(7)
byeyear <love_my_love@263.net >
2002.02.27
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
July 1999 | Linux Man Page |