Scroll to navigation

SEND(2) Linux Programmer's Manual SEND(2)

NAME

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 僅僅用於連接套接字,而 sendtosendmsg 可用於任何情況下.

目標地址用 to 指定, tolen 定義其長度.消息的長度用 len 指定. 如果消息太長不能通過下層協議,函數將返回 EMSGSIZE 錯誤,消息也不會被送出.

在數據傳送過程中所產生的錯誤不會返回給 send. 如果發生本地錯誤,則返回-1.

當要發送的消息長度大於套接字當前可用緩衝區時, send 將阻塞,除非在套接字上設置了非阻塞式輸入輸出模式. 對於非阻塞模式,這種情況下將返回 EAGAIN 錯誤. The 系統調用 select(2) 可以用來檢測何時可以發送更多的數據.

參數 flags 是一個標誌字,可以包含下列標誌:

對於支持帶外數據的套接字,
MSG_OOB 將送出 out-of-band (帶外)數據(比如, SOCK_STREAM 類型的套接字); 下層協議也必須支持. 帶外 數據.
在送出分組時不使用網關.只有直接連接在網絡上的主機 才能接收到數據.這個標誌通常僅用於診斷和路由程序. 可路由的協議族才能使用這個標誌;包套接字不可以.
使用非阻塞式操作;如果操作需要阻塞,將返回 EAGAIN 錯誤(也可以用 F_SETFL fcntl(2) 設置 O_NONBLOCK 實現這個功能.)
當流式套接字的另一端中斷連接時不發送 SIGPIPE 信號,但仍然返回 EPIPE 錯誤.
通知鏈路層發生了轉發過程:得到了另一端的成功應答. 如果鏈路層沒有收到通知,它將按照常規探測網絡上的相鄰 主機(比如通過免費arp). 只能用於 SOCK_DGRAMSOCK_RAW 類型的套接字,且僅對IPv4和IPv6有效.詳情參見 arp(7)

結構體 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_controlmsg_controllen 成員發送任何控制信息.內核所能處理的最大控制消息緩衝區長度由 net.core.optmem_max sysctl對每個套接字進行限定;參見 socket(7).

返回值

成功時返回發送的字符個數,否則返回-1.

錯誤代碼

其中一些是套接字層產生的標準錯誤.其他的是下層協議模塊產生的;參見 各自的man手冊.

指定了非法描述符.
參數 s 不是一個套接字.
參數指定的用戶地址空間非法.
消息長度越界.
套接字設置爲非阻塞式,但所請求的操作需要阻塞.
網絡接口輸出隊列已滿.這通常表明接口已停止發送,也有可能是 暫時性的擁擠(這不會發生在linux下,當設備隊列溢出時數據報 只是被簡單丟棄.
接收到信號.
沒有可用內存.
傳遞的參數非法.
連接套接字的本地端已關閉.這種情況下進程還會接收到 SIGPIPE 信號,除非設置了 MSG_NOSIGNAL

兼容於

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).

SEE ALSO

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

《中國linux論壇man手冊頁翻譯計劃》:

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

July 1999 Linux Man Page