Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()&write()五大函数简介

Unix网络编程是针对类Unix操作系统(包括Linux、BSD以及其他遵循POSIX标准的操作系统)进行网络通信开发的技术领域。网络编程涉及创建和管理网络连接、交换数据以及处理不同层次网络协议栈上的各种网络事件。在Unix环境中,网络编程通常涉及到以下核心概念和技术:

  1. Socket编程

    • 套接字(Socket)是进程间通信(IPC)机制,尤其是用于进程间跨越网络的通信。程序员可以通过创建和使用套接字来建立TCP连接、UDP传输或者更底层的原始套接字来进行定制化的网络通信。
  2. BSD Socket API

    • 这是最早的、也是最广泛使用的API,用于编写网络应用程序。包括创建套接字(socket())、绑定地址到套接字(bind())、监听连接请求(listen())、接受连接(accept())、发送和接收数据(send()/recv()、sendto()/recvfrom()等)以及关闭套接字(close())等函数。
  3. I/O多路复用

    • Unix系统提供了多种I/O多路复用技术,如select、poll和epoll,使得单个进程可以同时监控多个套接字,等待它们变为可读、可写或者其他网络事件的状态,而不必为每个套接字启动单独的线程。
  4. 异步I/O

    • 除了上述同步I/O模型,Unix系统还支持异步I/O,如POSIX aio(asynchronous I/O)接口,允许非阻塞地执行网络操作并在操作完成后得到通知。
  5. 信号处理

    • 在网络编程中,常常结合使用信号处理机制来响应某些特定条件,例如处理套接字错误、中断连接或超时等。
  6. 套接字选项

    • 设置套接字的各种参数,如套接字缓冲区大小(SO_SNDBUF、SO_RCVBUF)、超时时间(SO_SNDTIMEO、SO_RCVTIMEO)、重用地址(SO_REUSEADDR)、保持连接(SO_KEEPALIVE)、生存时间(IP_TTL)等。
  7. 守护进程

    • 在网络服务中,通常会创建长期运行的守护进程来持续监听和服务客户端请求。这些进程没有关联的控制终端,可以在后台稳定运行。
  8. 网络协议

    • Unix网络编程涵盖多种网络协议的实现,包括但不限于TCP/IP协议栈中的TCP(传输控制协议)和UDP(用户数据报协议),以及高级的应用层协议如HTTP、FTP、SMTP等。
  9. 安全相关

    • 对于安全相关的网络编程,Unix提供了SSL/TLS加密通信的支持,通过openssl等库可以实现安全套接字层(Secure Socket Layer)的编程。

总之,Unix网络编程不仅限于实现基本的网络通信功能,还包括了提高网络应用性能、健壮性和安全性的众多策略和技术。

接下来我将为您详细介绍网络编程中的五个关键函数以及它们在传统(非异步)Unix网络编程中的作用和流程:

  1. bind()

    • 函数原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    • 用途:这个函数用于给一个已创建的套接字(通过 socket() 函数创建)分配一个本地地址(IP 地址和端口号)。通常服务器程序在开始监听连接之前,会先使用此函数来指定它将在哪个端口上监听客户端连接。
  2. listen()

    • 函数原型:int listen(int sockfd, int backlog);
    • 用途:在调用 bind() 分配好地址之后,服务器需要调用 listen() 函数使套接字进入监听状态,准备接收来自客户端的连接请求。backlog 参数指定了系统可以挂起的最大连接请求数量。
  3. accept()

    • 函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    • 用途:在服务器端,accept() 函数用于接受来自客户端的连接请求。当有新的连接请求到达时,它会返回一个新的套接字文件描述符,这个描述符专门用于与发起连接的那个客户端进行通信。同时,还可以获取到客户端的地址信息。
  4. connect()

    • 函数原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    • 用途:在客户端,connect() 函数用于主动发起与服务器的连接。客户端首先创建一个套接字,然后调用 connect() 函数,向服务器的 IP 地址和指定端口发起连接请求。
  5. read()write()

    • 函数原型分别为:
      • ssize_t read(int fd, void *buf, size_t count);
      • ssize_t write(int fd, const void *buf, size_t count);
    • 用途:一旦连接建立成功,客户端和服务器都可以使用 read()write() 函数来传输数据。read() 从套接字读取数据并存入缓冲区,而 write() 将缓冲区的数据写入到套接字,从而在网络上传输。这两个函数在阻塞模式下会一直等到有足够的数据可读或所有数据写完为止。

详细的流程如下:

服务器流程

  1. 创建套接字 (socket()).

  2. 绑定套接字到本地地址 (bind()).

  3. 开始监听连接请求 (listen()).

  4. 接受客户端连接 (accept()).

  5. 通过 read()write() 与客户端交换数据。
    客户端流程

  6. 创建套接字 (socket()).

  7. 连接到服务器 (connect()).

  8. 通过 read()write() 与服务器交换数据。

以上流程是典型的基于 BSD Socket API 的网络编程基础流程,在实际的 Tokio 异步环境中,这些操作会有对应的异步版本(如 async fn bind, accept_async() 等),以支持非阻塞式、事件驱动的编程风格。

相关推荐
努力的小T10 分钟前
Linux apt-mirror 同步搭建本地源详解教程
linux·运维·服务器·ubuntu·云计算·debian
HackKong19 分钟前
高校网络安全_网络安全之道
java·网络·c++·python·学习·web安全·黑客技术
路飞雪吖~32 分钟前
【Linux】编写简易shell && 深度理解命令行解释器 && 环境变量 && 内建命令
linux·运维·服务器
只抄42 分钟前
随身 WiFi 连接 X-Wrt 共享网络与 IPv6 中继配置
网络·智能路由器
coniting12344 分钟前
【H3CNE邓方鸣】IPv6+2024.12.23
网络
神奇侠20241 小时前
基于Centos7.X系统端口占用处理
linux·运维·服务器
冷曦_sole3 小时前
linux-22 目录管理(二)rmdir命令,删除目录
linux·运维·服务器
记得多喝水o3 小时前
华三M-LAG场景下,部分MAC内的流量泛洪导致端口流量打满
网络
群联云防护小杜3 小时前
服务器被攻击怎么办
运维·服务器·网络·网络协议·安全·web安全
华为云开发者联盟3 小时前
混合云网络过于复杂?ENS给你全局一张网的极致体验
网络·ens·混合云·华为云stack