zoukankan      html  css  js  c++  java
  • 网络基础--对套接字描述符的本质理解

    首先了解下数据在client与server端的通信中的收发过程

    考虑单向的数据流,即

    即A(客户端)向B(服务端)发送数据。 在ProgramA中,定义一个数组char buf[100] = "tcp" ;那么buf就是应用程序缓冲区,即图中A对应的圆内存,send / write函数对应上面蓝色的socket API,内核缓冲区对应黄色方形部分。可知,send的作用就是把应用程序缓冲区的数据拷贝到内核缓冲区而已。内核缓冲区的数据经过网卡,历经网络传到B端的网卡(TCP协议),然后进入B的内核缓冲区,再通过recv / read 函数剪切/复制到B的应用程序缓冲区。

    客户端与服务器端都会通过socket生产一个套接字描述符fd;

    实际上

    1.首先知道,套接字描述符是用来标定系统为当前的进程划分的一块缓冲空间的,类似于文件描述符,不过二者有些区别;
    2.其次应该知道的是,这块缓冲空间并不是一开始就被系统划分给进程的
    3. 对于 server 端而言,划分系统缓冲空间的时刻是: 当server 决定接收来自 client 的连接请求,
    即 accept 方法成功执行,返回一个 > 0 的整数(也就是新的套接字描述符newfd),这个套接字指向的缓冲区包含read缓冲区和write缓冲区
    系统才会为其分配缓冲空间,自然, 这块缓冲空间是通过 accept 新的套接字描述符来指定的 ;
    4. 对于 client 端而言,划分系统缓冲空间的时刻是: 当 client 端执行 connect 函数正确的时候,
    connect 函数正确执行,说明此 client 端的连接请求已经被 server 端接收,剩下的就需要系统为 client 划分缓冲空间,
    用来接收来自于 server 端的返回结果。 这个时候,系统才会为其分配缓冲空间,
    而该缓冲空间使用 client 一开始创建套接字的 socket 函数的返回值标定即可。这个套接字指向的缓冲区包含read缓冲区和write缓冲区
    ————————————————
    由上可知:

    每一端都会通过socket生成属于自己的套接字描述符fd,用来标定系统为当前进程划分的缓冲空间,通过缓冲空间可以收发数据,对fd进行操作缓冲空间就像对文件进行操作一样,使用read、write、send、recvfrom等函数进行数据收发读写,并且可以通过bind、listen、setsockopt等函数对其进行属性的设置。

    ————————————————
    图文转自:

    recv,write,send,read,recvfrom,sendto区别,详解

  • 相关阅读:
    无忌缩略语及常用语词典
    大家都说不建议直接使用 @Async 注解?为什么??
    Comparable 和 Comparator 接口的区别?还傻傻分不清?
    Apache Log4j 漏洞影响有多大?Google 调查报告出炉!
    Logback 也爆雷了,惊爆了。。。
    Log4j 2.3.1 发布!又是什么鬼??
    Spring Boot 实现读写分离,还有谁不会??
    Spring Cloud 2020.0.5 发布,新特性一览,别掉队了!
    终于!Spring Boot 最新版发布,一招解决 Log4j2 核弹级漏洞!
    Log4j 2 杀不死 Java!
  • 原文地址:https://www.cnblogs.com/y4247464/p/12238129.html
Copyright © 2011-2022 走看看