前言

对于Linux网络编程,有很多坑需要我们去踩。在这个时候,我们才会知道理论知识的重要性。无论是哪种语言,网络编程都可以写成厚厚的一本书。举个例子,比如“当网络断掉,我们调用write去往socket中写入数据,为什么返回正常写入呢?”。所以有空多看看《TCP/IP详解》,《UNIX网络编程》等经典书籍来补充网络知识。

深入理解write

首先,我们来解决上面的问题。为什么网络断了,还能write还是返回成功呢?我们先看write的定义:

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

对于write的返回值,它表示写入的字节数。而这个写入,是写到哪呢?是成功发送的意思吗? 其实并不是,write成功返回,只是buf中的数据被复制到了kernel中的TCP发送缓冲区。至于数据什么时候被发往网络,系统调用层面不会给予任何保证和通知。

所以,我们并不能直接根据write的返回值来判定发送成功,这也就是为什么网络断掉了,write的返回值和我们希望写入的值是一样的。

阻塞和非阻塞

读写操作肯定会涉及阻塞和非阻塞的问题。那write和read在什么情况下会阻塞呢?当kernel中该socket的发送缓冲区已满时write会阻塞。而read调用阻塞,通常是发送端的数据没有到达。

对于每个socket,拥有自己的发送缓冲区和接收缓冲区。两个缓冲区大小都由系统来自动调节,但一般在default和max之间浮动。

默认socket是阻塞的,将一个socket 设置成非阻塞模式,可以使用fcntl方法:

int flags;
if ((flags = fcntl(fd, F_GETFL, NULL)) < 0) {return -1;
}
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {return -1;
}

阻塞(默认)和非阻塞模式下read/write行为的区别:

  1. read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满时返回。只有当接收缓冲区为空时,阻塞模式才会等待,而非阻塞模式下会立即返回-1。

  2. 阻塞的write只有在缓冲区足以放下整个buffer时才返回。非阻塞write则是返回能够放下的字节数,之后调用则返回-1。

对于阻塞的write有个特殊情况:

当write阻塞等待时,对端关闭了socket,则write则会立即将剩余缓冲区填满并返回所写的字节数,再次调用write则会失败。

更多精彩文章,欢迎关注"嵌入式软件开发交流"

欢迎大家关注我的微信公众号!!

深入理解Socket的读写相关推荐

  1. 简单理解socket协议

    TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间 ...

  2. 简单理解Socket 协议

    前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有意思,动 ...

  3. 深入理解Socket套接字原理

    Socket套接字原理 1.什么是Socket 在计算机领域,套接字Socket作为计算机之间进行通信的固定的约定方式之一存在.这种太抽象了,我举个例子,我们要是用笔记本电脑前需要先对电脑供电,那供电 ...

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

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

  5. 透彻理解Socket网络编程

    所谓的Socket(套接字),是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换.需要满足三元组------(协议,本地地址,本地端口号) 在<计算 ...

  6. readn writen实现linux下socket缓冲区读写

    socket上的read write 操作不同与一般的文件IO操作,socket上的用read write读写的字节数可能比要求的少,但这并不是错误,原因是socket的缓冲区可能已经达到了极限.此时 ...

  7. UNIX(进程间通信):16深入理解Socket

    socket又叫套接字或者插口,它也是进程间通信的一种方式,实际上就是网络上的通信节点,应用程序只需要链接到socket就可以和网络上任何一个通信端点连接.传送数据.socket封装了通信的细节,我们 ...

  8. 怎么理解socket ?

    看了很多的博文,各有各的好,自己也理解了一点. 打个比方,现在你的书包里有一台笔记本电脑(server),一个耳机(client),一个u盘(clinet),一个鼠标(client),socket就可 ...

  9. 简单理解socket(socket.AF_INET,socket.SOCK_STRE,os.dup2(s.fileno(),0),subprocess.call([“/bin/bash“,“-i“])

    前言:因为最近学习渗透时,使用python编写了一个木马,但是对里面的函数/方法功能并不了解,于是查阅资料,总算有了一定了解,于是记录下来 木马文件如下: import socket,subproce ...

最新文章

  1. Codeforces 535C - Tavas and Karafs
  2. 关于SAP物料的历史库存
  3. linux根据条件查找文件、根据文件内容查找文件
  4. Android之单复选框及Spinner实现二级联动
  5. sql批量修改字段内容的语句-SQL技巧
  6. Mybatis多条件直接查询Param注解版
  7. HTML5中的webSocket、ajax、http
  8. 建立密钥,远程登录LINUX----ssh-keygen
  9. AutoResetEvent类的使用
  10. HTTP缓存原理及相关知识(1)
  11. retroarch游戏模拟器使用
  12. 基于stm32的自动调速风扇
  13. 小仲马《茶花女》读后感
  14. 坚果云云盘告诉你如何保护自己的文件不被泄露?
  15. Android启动过程研究(二:AIL描述的init.rc)
  16. el-date-picker由中国时间转换成格林尼治时间
  17. 优化jsj脚本,防止浏览器卡死
  18. 数据分析师是热门职业么?转行容易么?
  19. Windows常用shell命令
  20. ceph monitor 选举leader和peon的过程

热门文章

  1. 山东各大学计算机科学技术学校排名,2016山东省大学最佳专业排名
  2. Android的智能数字多媒体播放器-dvico TVIX Xroid A1
  3. DXGI——DirectX Graphics Infrastructure
  4. mysql 累计值做递减
  5. 音频提升音质解决方案之我找的过程
  6. c语言程序设计北京交通大学答案,北京交通大学《C语言程序设计(专)》复习题A...
  7. 【5G基础学习笔记】 5G核心网架构
  8. hp计算机如何重装win7,如何在惠普笔记本电脑中安装win7系统
  9. SEED-LABS Firewall Exploration Lab
  10. Hive SQL数据查询基础