C函数篇(send函数)

send()用于向一个已经链接的socket发送数据,若是无错误,返回值为所发送数据的总数,不然返回SOCKET_ERROR。网络

简述

向一个已链接的 套接口发送数据。
#include < winsock.h>
int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
s:一个用于标识已链接套接口的描述字。
buf:包含待发送数据的 缓冲区
len:缓冲区中数据的长度。
flags:调用执行方式。

注释

send()适用于已链接的数据包或流式 套接口发送数据。对于数据报类套接口,必需注意发送数据长度不该超过 通信子网的IP包最大长度。IP包最大长度在 WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。若是数据太长没法自动经过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。
请注意成功地完成send()调用并不意味着 数据传送到达。
若是传送系统的 缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,不然send()将阻塞。对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的 缓冲区大小。可用 select()调用来肯定什么时候可以进一步发送数据。
在相关套接口的选项之上,还可经过标志位flag来影响函数的执行方式。也就是说,本函数的语义既取决于套接口的选项也取决于标志位。后者由如下一些值组成:

值意义

MSG_DONTROUTE 指明数据不选径。一个WINDOWS套接口供应商能够忽略此标志;MSG_OOB 发送带外数据(仅适用于SO_STREAM;)。socket

返回值

若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小于len中所规定的大小)。不然的话,返回SOCKET_ERROR错误, 应用程序可经过WSAGetLastError()获取相应 错误代码
WSANOTINITIALISED:在使用此API以前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS 套接口实现检测到网络子系统失效。
WSAEACESS:要求地址为广播地址,但相关标志未能正确设置。
WSAEINTR:经过一个 WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEFAULT:buf参数不在用户 地址空间中的有效位置。
WSAENETRESET:因为WINDOWS套接口实现放弃了链接,故该链接必需被复位。
WSAENOBUFS:WINDOWS套接口实现报告一个 缓冲区 死锁
WSAENOTCONN:套接口未被链接。
WSAENOTSOCK:描述字不是一个套接口。
WSAEOPNOTSUPP:已设置了MSG_OOB,但套接口非SOCK_STREAM类型。
WSAESHUTDOWN:套接口已被关闭。一个套接口以1或2的how参数调用 shutdown()关闭后,没法再用send()函数。
WSAEWOULDBLOCK:
WSAEMSGSIZE:套接口为 SOCK_DGRAM类型,且数据报大于WINDOWS套接口实现所支持的最大值。
WSAEINVAL:套接口未用 bind()捆绑。
WSAECONNABORTED:因为超时或其余缘由引发虚电路的中断。
WSAECONNRESET:虚电路被远端复位。
相关文章
相关标签/搜索