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() 与客户端交换数据。

客户端流程

  1. 创建套接字 (socket()).
  2. 连接到服务器 (connect()).
  3. 通过 read() 和 write() 与服务器交换数据。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/298452.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubectl explain资源文档命令

学习并使用了一段时间的kubernetes,发现对k8s还是了解甚少,于是利用上下班通勤的时间又去B站看一些大佬的视频,又来重学巩固一遍知识,并做些记录。 之前在学习使用过程中未成了解过explain这个命令,因为自己部署的版本…

【开发、测试】接口规范与测试

接口测试基础 url 是互联网标准资源地址,称为统一资源定位符 组成:协议,服务器地址,端口号 HTTP协议 HTTP:超文本传输协议,基于请求与响应的应用层协议 作用:规定了客户端和服务器之间的信…

NoSQL之Redis配置

文章目录 NoSQL之Redis配置一、关系数据库和非关系数据库1、关系型数据库2、非关系型数据库3、非关系型数据库产生背景4、关系型数据库和非关系型数据库的区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同 5、总结5.1 关系型数据库5.2 非关系型数据库 二、Redi…

Anaconda/Python快速安装jieba 【win/mac】

一、直接上命令 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba 我是在PyCharm里面的终端输进去。 之后就很快速的看到成功的下图。 二、官网 官网下载的速度太慢了——这是官网地址https://pypi.org/project/jieba/#files 点进去之后点击下载&#xff0c…

Star GAN论文解析

论文地址:https://arxiv.org/pdf/1912.01865v1.pdf https://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf 源码:stargan项目实战及源码解读-CSDN博客 1. 概述 在传统方法中&#x…

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过,burp修改content-type绕过,常见的文件上传存放目录名 题目就叫upload,打开靶机 直接上传一个图片格式的一句话木马,返回如下: 提交练习5和9中的两种可以执行图片格式php代码的文件,修改con…

全面解析找不到msvcr110.dll,无法继续执行代码的解决方法

MSVCR110.dll的丢失可能导致某些应用程序无法启动。当用户试图打开依赖于该特定版本DLL文件的软件时,可能会遭遇“找不到指定模块”的错误提示,使得程序启动进程戛然而止。这种突如其来的故障不仅打断了用户的正常工作流程,也可能导致重要数据…

[中级]软考_软件设计_计算机组成与体系结构_08_输入输出技术

输入输出技术 前言控制方式考点往年真题 前言 输入输出技术就是IO技术 控制方式 程序控制(查询)方式:分为无条件传送和程序查询方式两种。 方法简单,硬件开销小,但I/O能力不高,严重影响CPU的利用率。 程序中断方式&#xff1…

极简云验证 download.php 文件读取漏洞复现

0x01 产品简介 极简云验证是一款开源的网络验证系统,支持多应用卡密生成:卡密生成 单码卡密 次数卡密 会员卡密 积分卡密、卡密管理 卡密长度 卡密封禁 批量生成 批量导出 自定义卡密前缀等;支持多应用多用户管理:应用备注 应用版…

数学建模-最优包衣厚度终点判别法(主成分分析)

💞💞 前言 hello hello~ ,这里是viperrrrrrr~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#xff…

armlinux-外部中断

s3c2440的中断框图 如果我们单纯配置一个按键的外部中断,就不存在子中断与优先级的问题。 由于是按键的外部中断,通过引脚的高低电平来触发。所以我们要先配置引脚的功能。 我们使用按键1,终端源为EINT8,对应引脚GPG0 通过用户手…

DBU-Net:用于乳腺超声图像中肿瘤分割的双分支U形网络

DBU-Net:用于乳腺超声图像中肿瘤分割的双分支U形网络 摘要引言材料和方法概述所提出的方法 DBU-Net Dual branch U-Net for tumor segmentation in breast ultrasound images 摘要 乳腺超声医学图像通常具有低成像质量沿着不清楚的目标边界。这些问题使得医生在诊断…

JS继承与原型、原型链

在 JavaScript 中,继承是实现代码复用和构建对象关系的重要概念。本文将讨论原型链继承、构造函数继承以及组合继承等几种常见的继承方式,并提供相应的示例代码,并分析它们的特点、优缺点以及适用场景。 在开始讲解 JavaScript 的继承方式之…

[java]网络编程

网络编程概述 计算机网络: 把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--创建新主题

前言 你可以在wordpress里面下载使用人家打包好的主题,但可能不是很好用,接下来就自己做一个自己的主题。你需要先找到xampp文件夹–htdocs–wordpress(我给更名为wplocal)–wp-content–themes 进入该文件夹之后你可以看到你之前下载导入的所有主题文件…

WPS 不登录无法使用基本功能的解决办法

使用wps时,常常有个比较让人烦恼的事,在不登录的情况下,新建或者打开文档时,wps不让你使用其基本的功能,如设置字体等,相关界面变成灰色,这时Wps提示用户登录注册或登录,但我又不想登…

MySQL中的两阶段提交

redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,都指的是写入到cache中。 无论是 Redo log 还是 Binlog,在事务执行过程中都会先写入到内存中。只有在特定的刷新条件下(例如事务提交时或者特定的刷新策略&…

ADB(Android Debug Bridge)操作命令详解及示例

ADB(Android Debug Bridge)是一个强大的命令行工具,它是Android SDK的一部分,主要用于Android设备(包括真实手机和平板电脑以及模拟器)的调试、系统控制和应用程序部署。 下面是一些ADB的常用命令&#xff…

用于无人机小型化设计的高精度温补晶振

用于无人机小型化设计的高精度温补晶振:TG2016SMN和TG2520SMN。无人机的发展可以说是非常的迅速,在安防,农业,交通,电力,直播等领域经常能看到无人机大显身手。无人机的应用场最是非常的广泛,功能更强&…

python函数练习2

找出10000以内能被5或6整除,但不能被两者同时整除的数(函数) def func():for i in range(1,50):if (i % 5 0 or i % 6 0 ):if i % 5 0 and i % 6 0:continue #利用continue跳过能被5和6整除的数print(i) func()写一个方法,计算…