文档章节

linux的send和recv

小绿豆蛙
 小绿豆蛙
发布于 2014/06/19 11:10
字数 628
阅读 14
收藏 0
点赞 0
评论 0

int  send(SOCKET s, const char *buf,   int len,   int flags);

该函数在调用的时候,首先检测数据长度len与s关联的发送缓冲区的长度,如果len的长度大于发送缓冲区的长度,函数会返回报错SOCKET_ERROR,这个时候数据就要截断一段段的发送。如果len<=s缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲区数据。

如果发送缓冲区的数据正在发送就等待期发送完再发送该数据。

如果发送缓冲区的数据没开始发送就检测缓冲区剩余的长度能不能装得下len长度数据,如果len>剩余缓存区长度则send就等待,等待缓冲区数据被发送出去之后能容得下len长度了再把buf数据copy过来。如果ken<=剩余缓冲区长度则直接把buf拷贝到发送缓冲区里。【send仅仅是把数据copy到发送缓冲区里,并不是直接就发走了,发送是协议发送,send函数只是实现数据的copy而已】。如果send函数copy成功就返回成功字节数,否则返回SOCKET_ERROR.如果网络中断会收到一个SIGPIPE信号。

int recv (SOCKET s, char* buf   ,int len,   int flags);

该函数在调用时候先检查s缓冲区发送数据是否被协议发送完毕,如果没有先等待数据被发送,出错返回SOCKET_ERROR.

如果S缓冲区没有待发送的数据,或者发送成功,recv就检测s接收缓冲区的情况:

如果协议正在接受,函数就等待接收完毕之后recv就把数据copy到buffer变量中,如果没有数据就一直等待。当copy数据时候很有可能数据的长度会超出buf的长度len,这时候就需要循环几次去读去接受的数据。recv函数也仅仅是copy就是把数据从接收缓冲区copy到buf中。真正接受的过程也是由协议做的。如果recv在copy中出错,返回SOCKET_ERROR,否则如果在等待协议接收数据时候网络中断了,进程会收到一个SIGPIPE信号。

问:为什么recv函数时候要检测发送数据缓冲区,等发送数据缓冲区没有准备发送的数据之后再检测接收数据缓冲区?

本文转载自:http://blog.sina.com.cn/s/blog_732784f70100t0ti.html

共有 人打赏支持
小绿豆蛙
粉丝 0
博文 30
码字总数 13280
作品 0
海淀
程序员
Linux下进程间通讯方式 - UNIX Domain Socket

概述 Linux下进程通讯方式有很多,比较典型的有套接字,平时比较常用的套接字是基于TCP/IP协议的,适用于两台不同主机上两个进程间通信, 通信之前需要指定IP地址. 但是如果同一台主机上两个进程...

程序手艺人 ⋅ 01/03 ⋅ 0

linux dns服务器Recv-Q瞬间增大

dns服务器问题: Recv-Q这个值总是瞬间增大,导致dns服务器不能解析。 Recv-Q 959928 and Send-Q 1272 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address For......

yangshuyuan ⋅ 04/17 ⋅ 0

linux高性能网络编程读书笔记之socket数据读写

数据读写分为TCP数据读写,UDP数据读写,通用数据读写 1.TCP数据读写 定义:socket是连接用户空间和内核空间,TCP和UDP是内核第一层。 解释:对于文件的read和write同样适用于socket 例子:对...

jackdongting ⋅ 02/01 ⋅ 0

ZFS 0.7.9 发布,动态文件系统

ZFS 0.7.9 发布了。ZFS文件系统的英文名称为Zettabyte File System,也叫动态文件系统(Dynamic File System),是第一个128位文件系统。最初是由Sun公司为Solaris 10操作系统开发的文件系统。...

达尔文 ⋅ 05/13 ⋅ 0

Linux下阻塞与非阻塞IO

阻塞:顾名思义,就是指在执行设备操作时若不能获得资源则挂起操作,直到满足可操作的条件后再进行操作,被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件满足。 非阻塞:...

技术小阿哥 ⋅ 2017/11/28 ⋅ 0

Linux socket

Linux下socket有select、poll、epoll和AIO等方式,其中,前三种为同步方式。 有很多种方法可以设置socket为非阻塞模式,常用的是使用fcntl(sockfd, FSETFL, ONONBLOCK); 在阻塞模式下,可以通...

山里来的鱼 ⋅ 2016/08/20 ⋅ 0

linux 本地socket

server 端: void recvData(void arg){ char recvbuf[1024]; int conn = (int )arg; while(1) { memset(recvbuf,0,1024); recv(conn, recvbuf, sizeof(recvbuf),0); }} main 函数:int listen......

taoanran ⋅ 2014/05/08 ⋅ 0

C语言实现TCP连接

这两天复习了不少有关Windows平台和Linux平台的Socket编程知识,之前曾经写过一篇博文,示范过怎么使用C语言实现TCP连接,但是那篇文章写得很随意,所以现在我决定要重写这篇文章,既是为了总...

这名字有毒 ⋅ 2015/07/26 ⋅ 0

fulinux/libmsgque

libmsgque 消息队列(MESSAGE QUEUE)库项目简析 注: 本文假设你已经有linux开发环境 请确保你使用本库时是tag版本。 target=libmsgque-1.0 本项目采用 GPL 授权协议,欢迎大家在这个基础上进行...

fulinux ⋅ 2014/08/31 ⋅ 0

fulinux/libcanbus

libcanbus canbus(CAN BUS V2.0 B)扩展格式库项目简析 注: 本文假设你已经有linux开发环境 请确保你使用本库时是tag版本。 该库遵循的协议是SAE J1939-21-2006。 target=libcanbus-1.0 本项目...

fulinux ⋅ 2016/03/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 9分钟前 ⋅ 0

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部