首先我们来看看概念:
send() 是一个C函数用于线程发送。分系统操作
linux下相关函数:sendto,sendmsg,recv,recvfrom,recvmsg,socket
头文件:
#include <sys/socket.h>
函数定义:ssize_t send (int sockfd,const void *msg,size_t len,int flags);
参数表达:
第一个参数:sockfd 指定发送套接字描述符。
第二个参数:msg 存放发送数据的缓存区。
第三个参数:len 指定要发送数据字符的大小。
第四个参数: flags 标志 。
flags参数如下:
MSG_DONTROUTE 勿将数据路由出本地网络
MSG_DONTWAIT 允许非阻塞操作(等价于使用O_NONBLOCK)
MSG_EOR 如果协议支持,此为记录结束
MSG_OOB 如果协议支持,发送带外数据
函数说明
send()用来将数据传给指定sockfd,使用send时套接字必须已经连接,send如果错误返回-1。send成功返回代表数据已经无错误的发送到网络上,并步表示连接的另一端的进程接收数据。
返回值
成功返回发送的字节数,失败返回-1,错误存在errno;
windows下相关函数:
向一个已连接的套接字发送数据
#include <winsock.h>
函数定义 int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
参数表达:
第一个参数:s 指定已经连接套接字描述符。
第二个参数:buf 存放发送数据的缓存区。
第三个参数:len 缓存区数据大小。
第四个参数: flags 调用执行方式。
flags标志:
函数说明:
send()适用于已经连接的数据包或流式套接字发送数据,对于数据报类套接字,必须注意发送数据长度不应超过通讯子网IP包最大长度。IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下才层协议,则返回WSAEMSGSIZE错误,数据不会被发送。请注意成功的完成send()调用并不意味只数据传送到达。
如果传达系统的缓存区空间不够保存需传送的数据,除非套接字处于阻塞I/O方式,否则send()将阻塞,对于非阻塞sock_stream类型的套接字,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的缓存区大小。可用select()调用来确定何时能够进一步发送数据。在相关套接字的选项上,还可通过标志位flag来影响函数执行方式。也就是说本函数的语义即取决于套接字的选项也也取决于标志位。
返回值
错误返回SOCKET_ERROR
应用程序可通过WSAGetLastError()获取相应错误代码
成功返回所发送数据的总数(这个数据可能小于len中所规定的大小)