send+recv注意事项
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成功了并不代表数据就真的发送到另一端的说法
send+recv注意事项的更多相关文章
- easyHOOK socket send recv
代码比较简单,就不做注释了. 包含一个sockethookinject.DLL 和sockethook.exe 有一点不清楚, SetExclusiveACL可以添加当前线程的hook, 但是eas ...
- 套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg
函数原型 read/write系原型 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); #include ...
- 套接字中的recv与send的注意事项
recv() 特征* 如果连接的另一端断开连接,则recv立即返回空子串* recv是从接受缓冲区取出内容,当缓冲区为空则阻塞* recv如果一次接受不完缓冲区内容,下次会继续接收 send() 特征 ...
- linux socket下send()&recv()调用
1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...
- update_all_fun(send recv)
'''Send messages through all edges >>> update all nodes.DGLGraph.update_all(message_func='d ...
- 一文彻底搞通TCP之send & recv原理
接触过网络开发的人,大抵都知道,上层应用使用send函数发送数据,使用recv来接收数据,而send和recv的实现原理又是怎样的呢? 在前面的几篇文章中,我们有提过,TCP是个可靠的.全双工协议.其 ...
- UNIX网络编程-recv、send、read、write之间的联系与区别
1.read ----------------------------------------------------------------------- #include <unistd.h ...
- VC++ 用setsockopt()来控制recv()与send()的超时
在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 以下是来自于网上一篇文章中的摘录,它是这样写的: ;//1秒, //设置发送超时 setsockopt ...
- setsockopt()用法(参数详细说明) recv、send的超时处理
源于recv send 阻塞和非阻塞 int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen); s(套 ...
随机推荐
- 你的程序支持复杂的时间调度嘛?如约而来的 java 版本
你的程序支持复杂的时间调度嘛? 这篇文章介绍了时间适配器的c#版本,是给客户端用的,服务器自然也要有一套对应的做法,java版本的 [年][月][日][星期][时间] [*][*][*][*][*] ...
- .Net中的并行编程-3.ConcurrentQueue实现与分析
在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...
- 关于在aspx前台使用后台变量的问题
我们经常会在后台定义一个变量,然后在用<%=变量名%>这种方式去获取,但是有时候<head></head>里面获取变量的时候,有时候会获取不到是怎么回事呢 前台: ...
- 记录最初工作下的笔记($.each)
没事开始写博客,留下以前工作中常用的笔记,内容不全或者需要补充的可以留言,我只写我常用的. each遍历在工作中很常用,平时工作最常用的就是快速找到html上dom节点以达到找寻数据,和ajax接受j ...
- 数据结构:链表(python版) 续:增加比较函数
题目: 基于元素相等操作"=="定义一个单链表的相等比较函数.另请基于字典序的概念,为链表定义大于,小于,大于等于,小于等于的判断 class LList: "" ...
- Hibernate-chapter one
======什么是Hibernate???====== Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的 ...
- 【算法】PHP实现冒泡排序和快速排序--防遗忘
有没有这样的感觉,排序算法虽然简单,但是没看过一次,一会就又忘了,所以有必要 自己使用实际的代码运行实现,才记忆牢固,为此Mark //需求:将数组中元素,从大到小排列$a = array(11, 2 ...
- tomcat 自定义classpath(亲自测试)
因为一直以来使用tomcat和weblogic作为应用服务器为主,最近在升级新中间件的过程中遇到一个问题,我们的web前端应用现在升级是进行全量包升级的,因为现在的系统架构为前端和后端通过rpc框架交 ...
- [threeJs][新浪股票api][css3]3D新浪财经数据-最近A股涨的也太疯了......
使用threeJS搭配新浪股票财经API 在线: http://wangxinsheng.herokuapp.com/stock 截图: A股涨幅榜[一片红10%] 检索[单击添加到自选内,自选使用l ...
- webpack CommonsChunkPlugin详细教程
1.demo结构: 2.package.json配置: { "name": "webpack-simple-demo", "version" ...