send()函数学习

首先我们来看看概念:

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 如果协议支持,发送带外数据

MSG_NOSIGNAL 禁止向系统发送异常信息

函数说明

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标志:

MSG_DONTROUTE 指明数据不选径。一个WINDOWS套接口供应商可以忽略此标志;

MSG_OOB 发送 带外数据(仅适用于SO_STREAM;)。

函数说明:

send()适用于已经连接的数据包或流式套接字发送数据,对于数据报类套接字,必须注意发送数据长度不应超过通讯子网IP包最大长度。IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下才层协议,则返回WSAEMSGSIZE错误,数据不会被发送。请注意成功的完成send()调用并不意味只数据传送到达。

如果传达系统的缓存区空间不够保存需传送的数据,除非套接字处于阻塞I/O方式,否则send()将阻塞,对于非阻塞sock_stream类型的套接字,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的缓存区大小。可用select()调用来确定何时能够进一步发送数据。在相关套接字的选项上,还可通过标志位flag来影响函数执行方式。也就是说本函数的语义即取决于套接字的选项也也取决于标志位。

返回值

错误返回SOCKET_ERROR
应用程序可通过WSAGetLastError()获取相应错误代码

成功返回所发送数据的总数(这个数据可能小于len中所规定的大小)




       



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值