send+recv注意事项
2024-10-11 01:54:19
send
函数原型
ssize_t send( SOCKET s, const char *buf, size_t len, int flags )
注意事项
- 待发送数据长度
data_len
- 套接字s的发送缓冲长度
buf_len
- 发送缓冲区剩余空间
space_len
if(data_len > buf_len)
return SOCKET_ERROR
else{
if(协议正在发s缓冲中的数据)
等待发送完成
else{
if(data_len > space_len)
等待协议把s的数据发送完
//除send外的socket函数开始前都要等发送缓冲区清空
if(发送时网络断开)
return SOCKET_ERROR
else
if(把buf中的数据复制到剩余空间 == success)
return 实际复制的字节数
//此时数据还没由协议发送到另一端
//等待传输时断网,调用send的进程会收到SIGPIPE
else
return SOCKET_ERROR
}
}
recv
函数原型
ssize_t recv(int s, char *buf, size_t len, int flags)
注意事项
while(s发送缓冲区的数据正在被协议传输)
if(网络错误) return SOCKET_ERROR
while(s接收缓冲区没有数据 || 正在接数据)
continue
if(复制s接收缓冲区数据到buf == success)
if(在等待协议接收数据的时候网络中断)
return 0
else//大于buf的长度就要分多次接收了
return 实际复制的字节数
else
return SOCKET_ERROR
汇总
- 上面的过程只是为了揭示其中的注意事项,实际实现要复杂更多
- 从上面的描述可以看出,接收和发送数据的主体都是协议,而不是send和recv
- 所以才会有send成功了并不代表数据就真的发送到另一端的说法
最新文章
- Yii2框架实现计数器功能
- CentOS 7部署OpenStack(二)—安装keystone服务
- 自动获取MyEcilipse注册名和注册码的方法
- hdu 5105 求函数极值 函数求导/三分法
- 把时间转成适合符合日常习惯的格式【js】
- iOS设备 屏幕尺寸、操作系统、摄像头像素、发行时间 汇总
- web.xml配置bug之提示The content of element type ";web-app"; must match ";(icon?,display- name?,description?,distributable?,
- Linux管道的实现机制
- 基于shiro授权过程
- BZOJ 3091 城市旅行
- ubuntu 安装jdk7总结
- java 抽象(abstract) 构造 静态(static) 总结--2017-03-02
- Sql2012数据库还原
- flex练习---纵横中文网
- 开源 , KoobooJson一款高性能且轻量的JSON框架
- Shader 屏幕后期特效 Shake(震屏)&;Wave(波纹)
- java中去除字符串(String)中的换行字符(\r \n \t)
- calayer 的特殊属性整理
- 【数据库_Mysql】Mysql知识汇总
- ";Access restriction: The type BASE64Encoder is not accessible due to restrict";问题解决