文档章节

linux的send和recv

小绿豆蛙
 小绿豆蛙
发布于 2014/06/19 11:10
字数 628
阅读 21
收藏 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

共有 人打赏支持
上一篇: socket结构体
下一篇: void类型
小绿豆蛙
粉丝 0
博文 33
码字总数 13280
作品 0
海淀
程序员
私信 提问
suse linux 网络连接

linux查看如下 eNeeds:~ # netstat -tunp Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 284 121.201.107.......

zimo_劫
2014/11/10
163
0
Linux下Socket编程中用send发送结构体

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

icheer
2012/05/24
0
0
基于VLC开发简单的播放器

内容 1、使用C语言,基于libvlc开发播放器,播放格式为H264编码的TS文件,TS文件不是从磁盘读取的,而是从网络接收的,对应的有个发送客户端。网络传输使用KCP实现,KCP通信模块已经编写测试...

天台道人
2016/08/13
9
0
Linux下进程间通讯方式 - UNIX Domain Socket

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

程序手艺人
01/03
0
0
linux socket常用函数

======== TCP ======== TCP_Server socket() bind() listen() accept() write() read() close() 和shutdown() TCP_Client socket() connect() send() 和recv() close() 和shutdown() ======......

长平狐
2013/01/06
56
0

没有更多内容

加载失败,请刷新页面

加载更多

Function函数式接口

Function函数式接口传入一个参数,返回一个值。 然后我们使用这个写个demo看看: 输出: 接口内部还有两个default方法和一个static方法,然后我们先看一下static方法 返回一个始终返回其输入...

woshixin
12分钟前
0
0
开发者和架构师之间最大的区别是什么?

1、开发者和架构师之间最大的区别是什么? 架构师和开发者一样,也经常写代码,简单的说,开发者和架构师之间最大的区别就是技术领导力。 软件架构师的角色需要理解最重要的架构驱动力是什么...

James-
43分钟前
2
0
java框架学习日志-4

补充一些spring配置文件的方法。 设置别名: <!--通过name直接设置别名--> <bean name="user2" class="cn.sxt.factory.UserDynamicFactory"> </bean> <!--有id的情况下也可以设置......

白话
45分钟前
2
0
20181213 上课截图

小丑鱼00
今天
1
0
nginx+php-fpm配置后页面显示空白的解决方法以及用nginx和php-fpm解决“502 Bad Gateway”问题

https://stackoverflow.com/questions/15423500/nginx-showing-blank-php-pages For reference, I am attaching my location block for catching files with the .php extension: location ~......

Yao--靠自己
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部