Socket 网络编程框架介绍

19 0 2023-11-20

  Kernel 提供了一套面向 Socket 的网络编程框架,并通过提供一组标准的 System call Aations,例如:基于 HTTP 协议的 Web 服务器、基于 SMTP 协议的邮件服务器、基于 FTP 协议的文件服务器等等。

  socket():创建一个新的 socket,返回一个 int 类型的 socket fd(File Descriptor,套接字文件描述符),用于后续的网络连接操作。

  bind():将 socket 与一个本地 IP:Port 绑定,通常用于服务端,以便在本地网络连接。

  Kernel 提供了一套面向 Socket 的网络编程框架,并通过提供一组标准的 System call Aations,例如:基于 HTTP 协议的 Web 服务器、基于 SMTP 协议的邮件服务器、基于 FTP 协议的文件服务器等等。

  socket():创建一个新的 socket,返回一个 int 类型的 socket fd(File Descriptor,套接字文件描述符),用于后续的网络连接操作。

  bind():将 socket 与一个本地 IP:Port 绑定,通常用于服务端,以便在本地网络连接。

  listen():开始来自远程主机的连接请求,通常用于服务器端,等待来自客户端的连接请求。

  cept():接受一个连接请求,返回一个新的 socket fd,通常用于服务器端,用于接收客户端的连接请求。

Socket 网络编程框架介绍

  需要注意的是,Socket API 并不是线程安全的,如果有多个线程同时使用了同一个 socket fd,则可能会导致数据传输错误或其他问题。为了避免这种情况,Application 需要进行适当的同步和数据处理。

  Struct Sock 包含了 Socket 的各种底层执行状态和操作信息,例如:接收和发送缓冲区、套接字队列、套接字协议信息等。

  值得注意的是,虽然不同的协议族都使用了同一套 Socket API,但也可能会存在一些特有的函数或者数据结构,用于实现协议族特有的功能。例如:

  函数功能:创建一个新的套接字,返回一个 int 类型的套接字文件描述符(作为 Linux 文件操作的句柄),用于后续的网络连接操作。

  函数作用:将套接字与一个本地 IP:Port 绑定。通常用于服务端,以便在本地网络连接。函数原型:

  函数作用:开始来自远程主机的连接请求。通常用于服务器端,在套接字上等待来自客户端的连接请求。

  函数作用:接受一个连接请求,返回一个新的、表示客户端的 Socket 文件描述符,作为服务端和客户端之间发送与接收操作的句柄。通常用于服务器端,用于接收客户端的连接请求。

  recv() 和 send() 函数,用于在 TCP Socket 中进行数据读写,属于阻塞式 I/O(Blocking I/O)模式,即:如果没有可读数据或者对端的接收缓冲区已满,则函数将一直等待直到有数据可读或者对端缓冲区可写。

  recvmsg() 和 sendmsg() 函数,用于在 TCP 和 UDP Socket 中进行数据读写,不仅可以读写数据,还可以读写对端地址、辅助数据等信息。

  MSG_PEEK:允许从接收队列中查看数据而不将其删除。这意味着,如果接收队列中有数据,recv() 函数将返回数据的一个副本,但是该数据仍将留在接收队列中。这对于查看接收队列中的数据而不实际处理它们非常有用。此外,使用 MSG_PEEK 选项,我们可以检查套接字缓冲区中是否有足够的数据可供读取,以便稍后调用 recv() 函数。

  MSG_WAITALL:如果套接字缓冲区中没有足够的数据,则 recv() 函数将一直等待,直到收到请求的数据量。

  MSG_DONTWAIT:指定此标志后,recv() 函数将立即返回,即使没有收到数据也不会阻塞。如果没有数据可用,则 recv() 将返回 -1,并将 errno 设置为 EAGAIN 或 EWOULDBLOCK。

  MSG_OOB:用于处理带外数据,即紧急数据。带外数据不遵循正常的传输控制协议(如 TCP),可以使用此标志将其标记为紧急数据并将其与其他数据分开处理。

  MSG_CTRUNC:如果接收缓冲区中的控制消息(例如带外数据或错误消息)比接收缓冲区长度长,则截断消息并返回。