Linux网络编程概述

Linux网络编程是在Linux操作系统环境下进行的网络相关程序开发,主要用于实现不同计算机之间的数据通信和资源共享。以下从基础知识、网络编程模型、常用函数和编程步骤等方面进行详细介绍:

基础知识

1. 网络协议

  • TCP/IP协议族:是互联网通信的基础协议,包括多个层次的协议。例如,IP协议负责网络层的数据包传输,TCP和UDP协议则工作在传输层。

    • TCP(传输控制协议):提供面向连接、可靠的、基于字节流的传输服务。在进行数据传输前需要建立连接,传输完成后需要断开连接,适合对数据准确性要求较高的场景,如文件传输、网页浏览等。

    • UDP(用户数据报协议):提供无连接、不可靠的传输服务。不需要建立连接,数据以数据报的形式发送,适合对实时性要求较高、对数据准确性要求相对较低的场景,如视频会议、实时游戏等。

2. 网络地址

  • IP地址:用于唯一标识网络中的设备,分为IPv4和IPv6两种。IPv4地址由32位二进制数组成,通常表示为点分十进制形式,如192.168.1.1;IPv6地址由128位二进制数组成,采用冒号分隔的十六进制表示。

  • 端口号:用于区分同一设备上不同的网络应用程序,范围从0到65535。其中,0 - 1023为系统保留端口,通常由系统服务使用,如HTTP服务默认使用80端口,HTTPS服务默认使用443端口。

网络编程模型

1. 客户端 - 服务器模型

  • 这是最常见的网络编程模型,由客户端和服务器两部分组成。服务器监听特定的端口,等待客户端的连接请求;客户端主动发起连接请求,与服务器建立连接后进行数据交互。

2. 多进程/多线程模型

  • 多进程模型:服务器为每个客户端连接创建一个新的进程来处理,各个进程之间相互独立,一个进程的崩溃不会影响其他进程。但创建和销毁进程的开销较大,会消耗较多的系统资源。

  • 多线程模型:服务器为每个客户端连接创建一个新的线程来处理,线程共享进程的资源,创建和销毁线程的开销相对较小。但线程之间的同步和互斥问题需要处理,否则可能会出现数据不一致的情况。

3. I/O多路复用模型

  • 使用selectpollepoll等函数,让一个进程可以同时监听多个文件描述符(包括网络套接字)的读写事件,当某个文件描述符有事件发生时,通知进程进行相应的处理。这种模型可以提高服务器的并发处理能力,减少系统资源的消耗。

常用函数

1. 套接字相关函数

  • socket():用于创建一个套接字,返回一个文件描述符。例如:

#include <sys/socket.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

其中,AF_INET表示使用IPv4地址族,SOCK_STREAM表示使用TCP协议。

  • bind():将套接字与指定的IP地址和端口号绑定。例如:

#include <arpa/inet.h>
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(8888);
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
  • listen():将套接字设置为监听状态,等待客户端的连接请求。例如:

listen(sockfd, 5);

其中,5表示允许的最大连接请求队列长度。

  • accept():接受客户端的连接请求,返回一个新的套接字描述符用于与客户端进行通信。例如:

struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
  • connect():客户端使用该函数向服务器发起连接请求。例如:

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(8888);
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

2. 数据读写函数

  • send()/recv():用于TCP套接字的数据发送和接收。例如:

// 发送数据
char *msg = "Hello, server!";
send(sockfd, msg, strlen(msg), 0);// 接收数据
char buffer[1024];
int n = recv(sockfd, buffer, sizeof(buffer), 0);
  • sendto()/recvfrom():用于UDP套接字的数据发送和接收,需要指定目标地址。例如:

// 发送数据
struct sockaddr_in server_addr;
// 初始化server_addr
sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));// 接收数据
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_addr_len);

编程步骤

1. 服务器端编程步骤

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

  2. 绑定套接字到指定的IP地址和端口号(bind())。

  3. 将套接字设置为监听状态(listen())。

  4. 接受客户端的连接请求(accept())。

  5. 与客户端进行数据交互(send()/recv())。

  6. 关闭套接字(close())。

2. 客户端编程步骤

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

  2. 向服务器发起连接请求(connect())。

  3. 与服务器进行数据交互(send()/recv())。

  4. 关闭套接字(close())。

示例代码

以下是一个简单的TCP服务器和客户端示例代码:

服务器端代码(server.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 8888int main() {int sockfd, connfd;struct sockaddr_in server_addr, client_addr;socklen_t client_addr_len = sizeof(client_addr);char buffer[1024];// 创建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服务器地址结构memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 绑定套接字if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");exit(EXIT_FAILURE);}// 监听套接字if (listen(sockfd, 5) == -1) {perror("listen failed");exit(EXIT_FAILURE);}printf("Server listening on port %d...\n", PORT);// 接受客户端连接connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);if (connfd == -1) {perror("accept failed");exit(EXIT_FAILURE);}printf("Client connected.\n");// 接收客户端数据int n = recv(connfd, buffer, sizeof(buffer), 0);if (n == -1) {perror("recv failed");exit(EXIT_FAILURE);}buffer[n] = '\0';printf("Received from client: %s\n", buffer);// 发送响应数据char *msg = "Hello, client!";send(connfd, msg, strlen(msg), 0);// 关闭套接字close(connfd);close(sockfd);return 0;
}

客户端代码(client.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define SERVER_IP "127.0.0.1"
#define PORT 8888int main() {int sockfd;struct sockaddr_in server_addr;char buffer[1024];// 创建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服务器地址结构memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);server_addr.sin_port = htons(PORT);// 连接服务器if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("connect failed");exit(EXIT_FAILURE);}printf("Connected to server.\n");// 发送数据char *msg = "Hello, server!";send(sockfd, msg, strlen(msg), 0);// 接收服务器响应int n = recv(sockfd, buffer, sizeof(buffer), 0);if (n == -1) {perror("recv failed");exit(EXIT_FAILURE);}buffer[n] = '\0';printf("Received from server: %s\n", buffer);// 关闭套接字close(sockfd);return 0;
}

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

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

相关文章

Linux内核perf性能分析工具案例分析

一、系统级性能分析工具perf原理 1. perf 的基本概念 内核集成&#xff1a;perf 直接集成在 Linux 内核源码中&#xff0c;能够深度访问硬件和操作系统层面的性能数据&#xff0c;具有低开销、高精度的特点。 事件采样原理&#xff1a;通过定期采样系统事件&#xff0…

word-spacing 属性

介绍 CSS word-spacing 属性&#xff0c;用于指定段字之间的空间&#xff0c;例如&#xff1a; p {word-spacing:30px; }word-spacing属性增加或减少字与字之间的空白。 注意&#xff1a; 负值是允许的。 浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号。 属…

5种特效融合愚人节搞怪病毒

内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 并在虚拟机里运行此代码!&#xff0c;病毒带来后果自负! #include <windows.h> #include <cmath> #include <thread> using namespace std; // 屏幕特效函数声明 void In…

深入理解 Windows 进程管理:taskkill 命令详解

引言 在 Windows 系统开发和日常使用中&#xff0c;我们经常会遇到程序卡死、文件被占用导致无法编译等问题。这时&#xff0c;taskkill 命令就成了解决问题的利器。本文将详细介绍 taskkill 的使用方法、常见场景以及注意事项&#xff0c;帮助你高效管理系统进程。 1. 什么是…

【C++】右值引用与完美转发

目录 一、右值引用&#xff1a; 1、左值与右值&#xff1a; 2、左值引用和右值引用&#xff1a; 二、右值引用的使用场景&#xff1a; 1、左值引用的使用场景&#xff1a; 2、右值引用的使用场景&#xff1a; 移动构造 移动赋值 三、完美转发&#xff1a; 1、万能引用…

wx201基于ssm+vue+uniapp的购物系统设计与实现小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

Mac 常用命令

一、文件操作(必知必会)​ ​1. 快速导航 cd ~/Documents # 进入文档目录 cd .. # 返回上级目录 pwd # 显示当前路径 2. ​文件管理 touch new_file.txt # 创建空文件 mkdir -p project/{src,docs} # 递归创建目录 cp …

Nginx RTMP 处理模块 (ngx_rtmp_handler.c) 详细分析

ngx_rtmp_handler 是 Nginx RTMP 模块中的核心处理部分&#xff0c;主要负责处理 RTMP 流会话中的数据接收、发送、ping 操作以及分块大小的设置等。 1. 全局变量 ngx_rtmp_naccepted: 记录接受的 RTMP 连接数。 ngx_rtmp_bw_out 和 ngx_rtmp_bw_in: 分别表示输出带宽和输入带…

(二)万字长文解析:deepResearch如何用更长的思考时间换取更高质量的回复?各家产品对比深度详解

DeepResearch的研究背景 业务背景&#xff1a;用更长的等待时间&#xff0c;换取更高质量、更具实用性的结果 当前AI技术发展正经历从“即时响应”到“深度思考”的范式转变。用户对延迟的容忍度显著提升&#xff0c;从传统200ms的交互响应放宽至数秒甚至数分钟&#xff0c;以…

综述速读|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey

论文题目&#xff1a;Retrieval-Augmented Generation for AI-Generated Content: A Survey 论文地址&#xff1a;https://arxiv.org/abs/2402.19473 bib引用&#xff1a; misc{zhao2024retrievalaugmentedgenerationaigeneratedcontent,title{Retrieval-Augmented Generation…

Spring Cache:简化缓存管理的抽象框架

Spring Cache Spring Cache是Spring框架提供的缓存抽象层&#xff0c;通过注解和自动化配置&#xff0c;简化应用中对缓存的操作&#xff0c;支持多种缓存实现&#xff08;如Redis、Ehcache、Caffeine&#xff09;。 1. 核心特性 声明式缓存&#xff1a;通过注解&#xff08;…

求矩阵某列的和

设计函数sum_column( int A[E1(n)][E2(n)], int j )&#xff0c;E1(n)和E2(n)分别为用宏定义的行数和列数&#xff0c;j为列号。在该函数中&#xff0c;设计指针ptr&A[0][j]&#xff0c;通过*ptr及ptrptrE2(n)访问第j列元素&#xff0c;从而求得第j列元素的和。在主函数中定…

IM腾讯Trtc与vod云点播:实现合流录制并上传,根据参数返回视频地址

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 文档传送门 2. java基础使用2.1 准备工作2.1.1 云控制台获取(密钥和密钥secret)2.1.2 找到trtc控制台2.1.3 vod云点播控制台 2.2 使用准备的数据进行操作2.2.0 引入依赖2.2.1 创建TrtcUtils工具类2.2.2 TrtcReqDTO 录制请求dt…

蓝桥杯 数三角

问题描述 小明在二维坐标系中放置了 n 个点&#xff0c;他想从中选出一个包含三个点的子集&#xff0c;使得这三个点能够组成一个三角形。 由于这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。 请帮他计算出一共有多少种选法可以组成等腰三角形。 …

【Kafka】从理论到实践的深度解析

在当今数字化转型的时代&#xff0c;企业面临着数据量呈指数级增长、业务系统愈发复杂的挑战。在这样的背景下&#xff0c;高效的数据传输与处理技术成为了关键。Kafka&#xff0c;作为一款分布式消息队列系统&#xff0c;凭借其卓越的性能和丰富的特性&#xff0c;在众多企业的…

Linux课程学习一

一.fopen与fclose函数 linux中fopen函数直接用man fopen 去查看 函数原型 FILE * fopen(constchar *path , cost char *mode) /* * description : 打开一个文件 * param ‐ path : 指定文件路径,如&#xff1a;"./test.txt"&#xff0c;也可以直接由文件名 * param …

【区块链安全 | 第十篇】智能合约概述

部分内容与前文互补。 文章目录 一个简单的智能合约子货币&#xff08;Subcurrency&#xff09;示例区块链基础交易区块预编译合约 一个简单的智能合约 我们从一个基础示例开始&#xff0c;该示例用于设置变量的值&#xff0c;并允许其他合约访问它。 // SPDX-License-Identi…

XML标签格式转换为YOLO TXT格式

针对的是多边形&#xff08;<polygon>&#xff09;来描述对象的边界&#xff0c;而不是传统的矩形框&#xff08;<bndbox>&#xff09; import xml.etree.ElementTree as ET import os from pathlib import Path# 解析VOC格式的XML文件&#xff0c;提取目标框的标…

大唐杯02 DTM.PX4.016

01 5G关键技术概述 回传压力大&#xff1a;核心网向基站回传压力大 02 5G关键技术介绍01

CSS3学习教程,从入门到精通, CSS3 盒子模型的详细语法知识点及案例代码(23)

CSS3 盒子模型的详细语法知识点及案例代码 CSS3 盒子模型完整指南 一、盒子模型基础 每个 HTML 元素都被视为一个矩形盒子&#xff0c;由以下部分组成&#xff1a; 内容区 (Content)内边距 (Padding)边框 (Border)外边距 (Margin) 二、语法知识点详解 1. 盒子的宽和高 sel…