文档章节

linux的send和recv

小绿豆蛙
 小绿豆蛙
发布于 2014/06/19 11:10
字数 628
阅读 15
收藏 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
博文 33
码字总数 13280
作品 0
海淀
程序员
Linux下进程间通讯方式 - UNIX Domain Socket

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

程序手艺人
01/03
0
0
用setsockopt()来控制recv()与send()的超时 linux

在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章...

abcMx
2013/07/10
0
0
用setsockopt()来控制recv()与send()的超时【转】

在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章...

icheer
2012/05/23
0
0
Linux下Socket编程中用send发送结构体

Socket中的send函数可以发送字符串,但不能直接发送结构体,因此在发送端先把结构体转成字符串,然后用send发送,在接收端recv字符串,再转换成原先的结构体,这个就是解决问题的主要思路,实...

icheer
2012/05/24
0
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
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部