🔌 第二章 用电信号传输TCP/IP数据
📄 一句话概括

socket() 只做三件事:划一块控制信息内存、写初始状态、分配描述符交回——此时还没跟任何服务器搭上关系。

📝 本节和前面几节的关系

2.1.2 看了实体长什么样;本篇看【创建】这步到底动了什么。

一、三连动作

① 划一块内存写初始控制信息(状态=空); ② 分配一个描述符(接着上次的号往下发); ③ 把号交回应用程序。

二、此刻的位置

管子只建了本端这头——对面是谁还不知道。 这也解释了为什么创建后必须 connect:不接通,写不进数据。

三、动手 Demo:调用 socket 时发生的事

三步清单:

for s in ['1. 划一块内存 -> 初始控制信息(状态=空)',
          '2. 分配一个描述符 -> 3',
          '3. 描述符交回应用程序']:
    print(s)

实跑输出:

--------------------------------------------------------------------
调用 socket 时发生的事
--------------------------------------------------------------------
  socket() 一步的三连动作:

    1. 划一块内存 -> 写入初始控制信息(状态=空)
    2. 分配一个描述符 -> 3
    3. 把描述符交回应用程序

  此时还没跟任何服务器搭上关系——管道两头的口,
  只建好了本端这一头。下一阶段 connect 才把另一头接上。

描述符从 3 起步(0/1/2 是标准输入输出错误流), 每开一个递增一号。

30 秒实验

  1. 写一行 Python 连开三个 socket,打印它们的 fileno()。
  2. 创建后立刻 send 看会怎样(报未连接)。
  3. 数数一次网页访问总共创建几个套接字。

常见误区

  1. 以为 socket() 已经连上服务器——它只建本端口。
  2. 以为描述符从 0 开始——0/1/2 被标准流占了。
自测三问(点开对答案) 1. socket() 的三个动作是什么? —— 划内存、写初始状态、分配描述符。 2. 创建完能直接 write 吗? —— 不能,还没 connect。 3. 此时控制信息里的对端地址是什么? —— 还空着。

相关笔记