• 网络基础--对套接字描述符的本质理解


    首先了解下数据在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区别,详解

  • 相关阅读:
    。。。剑指Offer之——用两个栈实现队列。。。
    。。。剑指Offer之——从尾到头打印链表。。。
    。。。剑指Offer之——替换空格。。。
    。。。剑指Offer之——二维数组中的查找。。。
    。。。归并排序。。。
    。。。快速排序。。。
    。。。冒泡排序。。。
    。。。选择排序。。。
    。。。Shell排序。。。
    Activiti学习笔记2 — HelloWorld
  • 原文地址:https://www.cnblogs.com/y4247464/p/12238129.html
Copyright © 2020-2023  润新知