read(),write(),recv(),send(),readv(),writev(),recvfrom(),sendto(),recvmsg(),sendmsg()详解

前文
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。

send()

ssize_t send(int s,const void* buf,size_t len,int flags);

用户缓冲区buf的数据通过send()函数不一定能够全部发送出去,要检查send()函数的返回值是否与计划的len的大小相同.

当send()函数返回值 < len,表示buf中有部分数据没成功发送,需要重新发送剩余数据.剩余数据发送需要对buf中的数据进行偏移,偏移大小为已成功发送的字节数。

recv()

ssize_t recv(int s,void* buf,size_t len,int flags);

recv()函数常用于TCP类型的套接字,UDP使用recvfrom()函数接收数据.在数据报套接字绑定地址和端口后,也可以使用recv()函数接收数据.
①当内核中的数据 < 指定的缓冲区,(未使用MSG_WAITALL标志),会复制缓冲区所有数据到用户缓冲区,并返回数据的长度.
当内核中的数据 > 指定的缓冲区,内核中多余的数据需要下次调用接收函数再复制.内核在复制用户指定的数据之后,会销毁已复制完毕的数据,并进行调。

总的来说:
在应用程序Program A中, 我们定义一个数组char Buf[100] = “hello”; 那么这个Buf就是应用程序缓冲区(对应上图的Program A中的某块内存), send函数对应上面蓝色的Socket API, 内核缓冲区对应上面的黄色部分。 我们看到, send函数的作用是把应用程序缓冲区中的数据拷贝到内核缓冲区, 仅此而已。 内核缓冲区中的数据经过网卡, 经历网络传到B端的网卡(TCP协议), 然后进入B的内核缓冲区, 然后由recv函数剪切/复制到Program B的应用程序缓冲区。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值