recv()是编程语言函数。

函数原型int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);

这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时:
(1)recv先等待套接字s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;
(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区如果套接字s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕当协议把数据接收完毕,recv函数就把套接字s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的);
recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

实例:

读数据的时候需要考虑的是当recv()返回的大小如果等于请求的大小,那么很有可能是缓冲区还有数据未读完,也意味着该次事件还没有处理完,所以还需要再次读取:
while(rs)
{
buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);
if(buflen < 0)
{
// 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读
// 在这里就当作是该次事件已处理
if(errno == EAGAIN)
break;
else
return;
}
else if(buflen == 0)
{
// 这里表示对端的socket已正常关闭.
}
if(buflen != sizeof(buf))
rs = 0;
else
rs = 1;// 需要再次读取
}

最新文章

  1. androidannotation study(1)---Activity, Fragment,Custom Class &amp; Custom View
  2. [ZZ] D3D中的模板缓存(3)
  3. Codeforces 380 简要题解
  4. js常用效果
  5. Nginx学习之六-nginx核心进程模型
  6. (转载)C# 编程 使用可空类型
  7. HTML - Textarea - 空格的问题解决方式
  8. 【Demo 0007】导航控制器
  9. 计算字符串中每种字符出现的次数[Dictionary&lt;char,int&gt;泛型集合用法]
  10. 关于combotree的用法总结
  11. pickle和json模块
  12. ajax实现异步校验
  13. SQL Server 扩展事件
  14. 钉钉自定义机器人 发送文本 换行 \n无效果
  15. CF1B Spreadsheets
  16. 修改SS配置文件使其同时支持IPV4和IPV6网络
  17. ASP .NET Core 基本知识点示例 目录
  18. TDataset.CopyFields
  19. Linux文件备份
  20. R小问题

热门文章

  1. cocos2d-x AssetsManager libcurl使用心得
  2. 搭建sftp服务+nginx代理
  3. Vue中div高度自适应
  4. 如何使用doctrine:migrations:migrate
  5. (转)javascript中call()、apply()、bind()的用法
  6. Why use async requests instead of using a larger threadpool?(转载)
  7. mysql 创建用户与授权
  8. IDA调试android so的.init_array数组
  9. git用远程库的内容覆盖本地
  10. iOS审核策略重磅更新:Guideline 2.1批量拒审