linux-----网络编程

  1. 网络编程基础概念
    • IP地址:是互联网协议地址,用于在网络中唯一标识一台设备。在IPv4中,地址是32位的二进制数,通常以点分十进制表示,如192.168.1.1。IPv6是128位的地址,用于提供更多的地址空间,格式更复杂。
    • 端口号:用于标识一台主机上的不同应用程序或服务。端口号范围是0 - 65535,其中0 - 1023被系统保留用于一些知名的服务,如HTTP(80)、HTTPS(443)、SSH(22)等。应用程序可以使用其他端口号来提供服务或进行通信。
    • 协议:网络协议规定了网络通信的规则和格式。常见的协议有TCP(传输控制协议)和UDP(用户数据报协议)。
      • TCP:是一种面向连接的、可靠的传输协议。它通过三次握手建立连接,在数据传输过程中会进行流量控制、拥塞控制和差错校验等,保证数据的可靠传输。适用于对数据准确性要求较高的场景,如文件传输、网页浏览等。
      • UDP:是一种无连接的、不可靠的传输协议。它不建立连接,数据发送方只管发送数据,接收方只管接收数据,不保证数据一定能到达,也不保证数据的顺序。但UDP具有传输速度快、开销小的特点,适用于对实时性要求较高,对数据准确性要求相对较低的场景,如视频直播、实时游戏等。
  2. 套接字(Socket)编程基础
    • 套接字的概念:在Linux网络编程中,套接字是一种通信机制,它提供了应用程序与网络协议栈之间的接口,使得应用程序可以通过网络进行通信。可以把套接字看作是通信的端点,就像电话的插座一样,应用程序通过它来发送和接收数据。
    • 套接字的类型
      • 流式套接字(SOCK_STREAM):基于TCP协议,提供面向连接的、可靠的字节流服务。
      • 数据报套接字(SOCK_DGRAM):基于UDP协议,提供无连接的、不可靠的数据报服务。
  3. 基于TCP的网络编程
    • 服务器端编程步骤
      • 创建套接字:使用socket函数创建一个套接字。函数原型为int socket(int domain, int type, int protocol);,其中domain指定协议族(如AF_INET表示IPv4),type指定套接字类型(如SOCK_STREAM表示TCP套接字),protocol通常设为0,表示使用默认协议。例如:int sockfd = socket(AF_INET, SOCK_STREAM, 0);
      • 绑定地址和端口:使用bind函数将套接字绑定到一个本地地址和端口。函数原型为int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);,其中sockfd是套接字描述符,addr是指向sockaddr结构体(对于IPv4通常使用sockaddr_in)的指针,包含IP地址和端口号信息,addrlen是结构体的长度。例如:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);  // 将端口号转换为网络字节序
server_addr.sin_addr.s_addr = INADDR_ANY;  // 绑定到所有可用的本地IP地址
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
 - **监听端口**:使用`listen`函数让套接字进入监听状态,等待客户端连接。函数原型为`int listen(int sockfd, int backlog);`,其中`sockfd`是套接字描述符,`backlog`表示等待连接队列的最大长度。例如:`listen(sockfd, 5);`。- **接受客户端连接**:使用`accept`函数接受客户端连接,该函数会阻塞,直到有客户端连接。函数原型为`int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);`,它返回一个新的套接字描述符,用于与客户端进行通信,原套接字继续监听其他客户端连接。例如:
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);
 - **与客户端通信**:使用`send`和`recv`函数在服务器端和客户端之间发送和接收数据。例如:
char buffer[1024];
recv(client_sockfd, buffer, sizeof(buffer), 0);  // 接收客户端数据
send(client_sockfd, "服务器响应", strlen("服务器响应"), 0);  // 向客户端发送数据
 - **关闭套接字**:使用`close`函数关闭套接字,释放资源。例如:`close(client_sockfd); close(sockfd);`。
  • 客户端编程步骤
    • 创建套接字:同服务器端,使用socket函数创建一个套接字。例如:int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    • 连接服务器:使用connect函数连接到服务器。函数原型为int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);,其中sockfd是套接字描述符,addr是指向包含服务器地址和端口号的sockaddr结构体的指针,addrlen是结构体长度。例如:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr.s_addr);  // 将IP地址转换为网络字节序
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
 - **与服务器通信**:使用`send`和`recv`函数发送和接收数据,与服务器端类似。- **关闭套接字**:使用`close`函数关闭套接字。
  1. 基于UDP的网络编程
    • 服务器端编程步骤
      • 创建套接字:使用socket函数创建一个UDP套接字。例如:int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
      • 绑定地址和端口:使用bind函数将套接字绑定到本地地址和端口,与TCP服务器端类似。
      • 接收和发送数据:使用recvfromsendto函数接收和发送数据。recvfrom函数原型为ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);,用于接收数据并获取发送方的地址。sendto函数原型为ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);,用于向指定地址发送数据。例如:
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[1024];
recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_len);
sendto(sockfd, "服务器响应", strlen("服务器响应"), 0, (struct sockaddr *)&client_addr, client_len);
 - **关闭套接字**:使用`close`函数关闭套接字。
  • 客户端编程步骤
    • 创建套接字:同服务器端,创建一个UDP套接字。
    • 发送和接收数据:使用sendtorecvfrom函数发送和接收数据,与服务器端类似,但不需要绑定地址和端口(系统会自动分配),或者可以绑定一个本地地址和端口用于接收服务器响应。
    • 关闭套接字:使用close函数关闭套接字。
  1. 高级网络编程主题
    • 非阻塞套接字和异步I/O:默认情况下,套接字操作是阻塞的,即函数(如acceptrecv等)会一直等待操作完成。非阻塞套接字可以让这些操作立即返回,通过轮询或使用异步I/O机制(如selectpollepoll等)来检查操作是否完成。epoll是Linux特有的高性能I/O复用机制,相比selectpoll,它在处理大量并发连接时效率更高。
    • 多线程/多进程网络服务器:为了提高服务器的并发处理能力,可以使用多线程或多进程来处理客户端连接。在多线程网络服务器中,主线程负责监听客户端连接,当有连接时,创建一个新线程来处理与该客户端的通信。多进程网络服务器类似,但使用进程来处理通信,进程间通信可以通过管道、共享内存等方式实现。
    • 网络安全相关编程:在网络编程中,安全是非常重要的。可以使用SSL/TLS协议来加密网络通信,防止数据被窃取或篡改。在Linux中,OpenSSL库是常用的加密库,通过它可以实现安全的网络连接,如在HTTP基础上实现HTTPS。

在这里插入图片描述

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

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

相关文章

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮,本次基于蓝牙通信的手机遥控智能灯设计功能如下: (1)用户可以通过蓝牙通信模块的作用下,在手机端遥控切换智能灯不同的工作模式; &#x…

阿里云百炼大模型生成贪吃蛇小游戏

阿里云百炼大模型生成贪吃蛇小游戏 为了在贪吃蛇游戏中添加背景音乐,我们可以使用Pygame的mixer模块。以下是修改后的代码,包含了背景音乐的加载和播放功能: 安装Pygame(如果你还没有安装): pip install p…

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍算法原理算法特点应用场景局限性 FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR1…

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法,如网格和点云,适合GPU加速的光栅化操作,但缺乏灵活性。而基于神经辐射场(NeRF)的表示方式,尽管质量高,但需要高成本的训练和渲染时间。此外&#xff0…

安卓环境配置及打开新项目教程,2024年12月20日最新版

1.去官网下载最新的Android Studio,网址:https://developer.android.com/studio?hlzh-cn 2.下载加速器,注册账号,开启加速器。网址:放在文末。 3.下载安卓代码,项目的路径上不能有中文,特别是…

不会心理描写,神态描写怎么办?

不会心理描写,神态描写怎么办? 文学创作,精微之处在于心理与神态之描绘。 一、夯实基础,积累素材。 欲使心理与神态描写生动,需先厚积薄发。博览群书,尤重经典之作。 “读万卷书,行万里路。…

【使用MCP协议连接本地和远程数据——以Claude的Windows客户端为例】

本博客内容主要是如何在Windows系统上为Claude客户端(无需开通会员)配置模型上下文协议(Model Context Protocol, MCP)服务器。 为什么选择 MCP? MCP 可帮助您在 LLM 之上构建代理和复杂的工作流程。LLM 经常需要与数据和工具集成&#xff0…

React:闭包陷阱产生和解决

在 React 中,闭包陷阱是一个常见的问题,尤其是在处理异步操作、事件处理器、或是定时器时。理解闭包的工作原理以及它在 React 中如何与状态和渲染交互,可以帮助你避免陷入一些常见的错误。 一、闭包陷阱的产生 1、什么是闭包陷阱&#xff1…

使用xjar 对Spring-Boot JAR 包加密运行

1 Xjar 介绍 Spring Boot JAR 安全加密运行工具,同时支持的原生JAR。 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露或反编译。 功能特性 无需侵入代码,只需要把编译好的…

[LeetCode-Python版] 定长滑动窗口1(1456 / 643 / 1343 / 2090 / 2379)

思路 把问题拆解成三步&#xff1a;入-更新-出。 入&#xff1a;下标为 i 的元素进入窗口&#xff0c;更新相关统计量。如果 i<k−1 则重复第一步。更新&#xff1a;更新答案。一般是更新最大值/最小值。出&#xff1a;下标为 i−(k-1) 的元素离开窗口&#xff0c;更新相关…

【AIGC-ChatGPT进阶副业提示词】末日生存指南 2.0:疯狂科学家的荒诞智慧

引言 在这个不断变化的世界中&#xff0c;末日似乎总是lurking在角落。但是&#xff0c;亲爱的幸存者们&#xff0c;不要害怕&#xff01;因为我&#xff0c;疯狂科学家2099&#xff0c;正在这里为你们带来最新版本的末日生存指南。这不是你祖母的应急手册&#xff0c;而是一本…

Web3.0安全开发实践:探索比特币DeFi生态中的PSBT

近年来&#xff0c;部分签名比特币交易&#xff08;PSBT&#xff09;在比特币生态系统中获得了显著关注。随着如Ordinal和基于铭文的资产等创新的兴起&#xff0c;安全的多方签名和复杂交易的需求不断增加&#xff0c;这使得PSBT成为应对比特币生态不断发展中不可或缺的工具。 …

Edge Scdn防御网站怎么样?

酷盾安全Edge Scdn&#xff0c;即边缘式高防御内容分发网络&#xff0c;主要是通过分布在不同地理位置的多个节点&#xff0c;使用户能够更快地访问网站内容。同时&#xff0c;Edge Scdn通过先进的技术手段&#xff0c;提高了网上内容传输的安全性&#xff0c;防止各种网络攻击…

oracle client linux服务器安装教程

p13390677_112040_Linux-x86-64_4of7.zip 安装前&#xff0c;确认/etc/hosts文件已配置正确 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.2…

【前端】Jquery拍照,通过PHP将base64编码数据转换成PNG格式,并保存图像到本地

目录 一、需求 二、开发语言 三、效果 四、业务逻辑&#xff1a; 五、web端调用摄像头 六、示例代码 1、前端 2、后端 一、需求 web端使用jquery调用摄像头拍照&#xff0c;并使用PHP把base64编码转换成png格式图片&#xff0c;下载到本地。 由于js不能指定图片存储的…

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…

提炼关键词的力量:AI驱动下的SEO优化策略

内容概要 在当今数字化营销的环境中&#xff0c;关键词对于提升网站的可见性和流量起着至关重要的作用。企业和个人必须重视有效的关键词策略&#xff0c;以便在竞争激烈的网络市场中脱颖而出。本文将深入探讨如何利用人工智能技术来优化SEO策略&#xff0c;特别是在关键词选择…

W25Q128读写实验(一)

十二、SPI 1. IIC与SPI对比 1. IIC 是半双工通讯&#xff0c;无法同时收发信息&#xff1b;SPI 是全双工通讯&#xff0c;可以同时收发信息&#xff1b; 2. IIC 通讯协议较复杂&#xff0c;而 SPI 通讯协议较简单&#xff1b; 3. IIC 需要通过地址选择从机&#xff0c;而 SPI …

uniApp使用腾讯地图提示未添加maps模块

uniApp使用腾讯地图&#xff0c;打包提示未添加maps模块解决方案 这是报错信息&#xff0c;在标准基座运行的时候是没问题的&#xff0c;但是打包后会提示未添加&#xff0c;可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key&#xff0c;定位服务可以继续用腾…

【开源项目】数字孪生轨道~经典开源项目数字孪生智慧轨道——开源工程及源码

飞渡科技数字孪生轨道可视化平台&#xff0c;基于国产数字孪生引擎&#xff0c;结合物联网IOT、大数据、激光雷达等技术&#xff0c;对交通轨道进行超远距、高精度、全天侯的监测&#xff0c;集成轨道交通运营数据&#xff0c;快速准确感知目标&#xff0c;筑牢轨交运营生命线。…