02. 套接字入门
# 02. 套接字入门
这一章节是来给你介绍套接字编程的。咱们假设看这本书的小伙伴都有点计算机网络的基础知识,但在网络编程这块儿还没什么实战经验哈。这本书可不会把套接字API的所有细节都讲一遍,建议你在看这本书的同时,也去翻翻手册,再参考参考其他网络编程指南。
Redis就是一个典型的服务器/客户端系统。好多客户端都能连到同一个服务器上,服务器会接收TCP连接发来的请求,然后再把响应发回去。在开始套接字编程之前,咱们得先学几个Linux系统调用。
socket()
系统调用会返回一个文件描述符(fd,file descriptor)。要是你不太熟悉Unix系统,我给你简单解释一下“fd”是啥:fd就是个整数,在Linux内核里,它就像是个“小标签”,能指向好多东西呢,比如一个TCP连接、一个磁盘文件、一个监听端口,或者其他的一些资源等等。
bind()
和listen()
这两个系统调用也很重要:bind()
的作用就是把一个地址和套接字fd关联起来,而listen()
能让咱们接收发到这个地址的连接。
accept()
这个系统调用会接收一个监听的fd。当有客户端连接到监听地址时,accept()
就会返回一个fd,这个fd代表的就是连接套接字啦。下面这段伪代码展示了服务器的典型工作流程:
fd = socket()
bind(fd, address)
listen(fd)
while True :
conn_fd = accept(fd)
do_something_with(conn_fd)
close(conn_fd)
1
2
3
4
5
6
7
2
3
4
5
6
7
read()
系统调用用来从TCP连接接收数据,write()
系统调用则是用来发送数据的。close()
系统调用会销毁fd指向的资源,还能把fd这个编号回收再利用。
咱们已经介绍了服务器端网络编程需要用到的系统调用。客户端这边呢,connect()
系统调用会接收一个套接字fd和地址,然后建立到这个地址的TCP连接。下面是客户端的伪代码:
fd = socket()
connect(fd, address)
do_something_with(fd)
close(fd)
1
2
3
4
2
3
4
下一章会用真正的代码,带你开启实战之旅!
上次更新: 2025/03/25, 00:48:42