Linux下Socket网络编程send和recv使用注意事项

1.send函数

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

(1)send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回-1;

(2)如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len;

(3)如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完;

(4)如果len小于剩余空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传送的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。

注意: (1)如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回-1;如果send在等待协议传送数据时网络断开的话,那么send函数也返回-1。

(2)要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回-1。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回-1)

(3)在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是终止进程。

2.recv函数

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

(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲 中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR。

(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数 据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中。(注意:协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)

(3)recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

Q&A: (1)两次send一次recv会发生什么? 一次性读取两次send的内容。

(2)recv之后,接收缓冲区会被清空吗? 是的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木头编程 - moTzxx

小程序 POST请求不到数据的一种情况

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

2243
来自专栏ppjun专栏

记录一个SQLException

我前端form-data上传图文到后台时,返回一个服务器内部异常SQLException: Incorrect string value: '\xE5\x92\...

1244
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版第四章函数的逆向

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

941
来自专栏运维小白

19.11 自动发现

自动发现 修改自动发现规则的相关数据获取间隔 ? 然后修改数据更新间隔(秒),改成以秒计算 60秒 ? 配置好以后到监控中心,查看图形相关,可以选择查看某一块网...

20911
来自专栏Ryan Miao

在idea中maven项目jdk编译version总是跳到1.5

bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5....

36310
来自专栏Python入门

python爬虫使用scrapy框架爬取顶点小说网

scrapy框架 是一个非常好的东西,能够实现异步爬取,节省时间,其实本文纯粹的按照之前的思维来做,

1890
来自专栏ml

PIL中的Image和numpy中的数组array相互转换

1. PIL image转换成array img = np.asarray(image) 需要注意的是,如果出现read-only错误,并不是转换的错...

3969
来自专栏电光石火

maven-source-plugin 自动将源码打包并发布

1923
来自专栏技术博文

smarty模板引擎原理解析

//php 控制器文件 <?php //引入模板引擎文件 include("20130304.php"); $smarty = new TinySmarty()...

3476
来自专栏hotqin888的专栏

EngineerCMS增加项目日志、大事记的时间轴

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1322

扫码关注云+社区

领取腾讯云代金券