编程与数学 03-002 计算机网络 16_网络编程基础

编程与数学 03-002 计算机网络 16_网络编程基础

    • 一、网络编程的基本概念
      • (一)客户端与服务器模型
      • (二)套接字(Socket)编程的基本原理
    • 二、基于TCP的网络编程
      • (一)TCP套接字的创建与使用
      • (二)示例程序(如简单的聊天程序)
    • 三、基于UDP的网络编程
      • (一)UDP套接字的创建与使用
      • (二)UDP编程的特点与应用场景
    • 四、总结

摘要:本文是计算机网络课程中关于网络编程基础的学习笔记。网络编程涵盖客户端与服务器模型、套接字编程、基于TCP和UDP的网络编程。客户端与服务器模型是常见网络应用架构,客户端请求服务,服务器提供服务。套接字是网络编程基础,用于实现通信,分为流式、数据报和原始套接字。基于TCP的编程提供可靠连接服务,基于UDP的编程提供无连接服务,适用于实时应用。通过学习这些内容,可深入理解网络编程概念和方法,为网络应用开发打下基础。

关键词:网络编程、客户端与服务器、套接字、TCP、UDP、实时应用

人工智能助手:Kimi


一、网络编程的基本概念

(一)客户端与服务器模型

  1. 定义

    • 客户端与服务器模型是一种常见的网络应用架构,其中客户端是请求服务的一方,服务器是提供服务的一方。客户端通过网络向服务器发送请求,服务器处理请求后返回响应。
  2. 特点

    • 客户端:客户端是用户使用的应用程序,如Web浏览器、邮件客户端等。客户端的主要功能是向服务器发送请求,并接收服务器的响应。
    • 服务器:服务器是提供服务的计算机,如Web服务器、邮件服务器等。服务器的主要功能是接收客户端的请求,并处理请求后返回响应。
    • 通信方式:客户端与服务器之间的通信通常通过套接字(Socket)进行,套接字是网络编程中的基本概念,用于实现网络通信。

(二)套接字(Socket)编程的基本原理

  1. 定义

    • 套接字(Socket)是网络编程中的基本概念,用于实现网络通信。套接字提供了一种抽象的接口,使得应用程序可以通过套接字进行网络通信。
  2. 类型

    • 流式套接字(SOCK_STREAM):流式套接字用于TCP协议,提供可靠的、面向连接的通信服务。
    • 数据报套接字(SOCK_DGRAM):数据报套接字用于UDP协议,提供不可靠的、无连接的通信服务。
    • 原始套接字(SOCK_RAW):原始套接字用于直接访问网络层协议,如IP协议。原始套接字通常用于网络协议的开发和调试。
  3. 工作过程

    • 创建套接字:通过调用socket()函数创建套接字。
    • 绑定地址:通过调用bind()函数将套接字绑定到一个地址和端口。
    • 监听连接:对于TCP套接字,通过调用listen()函数监听连接请求。
    • 接受连接:对于TCP套接字,通过调用accept()函数接受连接请求。
    • 发送和接收数据:通过调用send()recv()函数发送和接收数据。
    • 关闭套接字:通过调用close()函数关闭套接字。

二、基于TCP的网络编程

(一)TCP套接字的创建与使用

  1. 创建TCP套接字

    • 通过调用socket()函数创建TCP套接字:
      int sockfd = socket(AF_INET, SOCK_STREAM, 0);
      
      其中,AF_INET表示使用IPv4地址族,SOCK_STREAM表示使用TCP协议。
  2. 绑定地址

    • 通过调用bind()函数将套接字绑定到一个地址和端口:
      struct sockaddr_in addr;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(port);
      addr.sin_addr.s_addr = INADDR_ANY;
      bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
      
      其中,port是服务器的端口号,INADDR_ANY表示绑定到所有可用的网络接口。
  3. 监听连接

    • 通过调用listen()函数监听连接请求:
      listen(sockfd, backlog);
      
      其中,backlog是未完成连接队列的最大长度。
  4. 接受连接

    • 通过调用accept()函数接受连接请求:
      int clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);
      
      其中,clientfd是接受连接后返回的客户端套接字,client_addr是客户端的地址信息,client_len是客户端地址信息的长度。
  5. 发送和接收数据

    • 通过调用send()recv()函数发送和接收数据:
      send(clientfd, data, size, 0);
      recv(clientfd, buffer, size, 0);
      
      其中,data是要发送的数据,size是数据的大小,buffer是接收数据的缓冲区。
  6. 关闭套接字

    • 通过调用close()函数关闭套接字:
      close(sockfd);
      close(clientfd);
      

(二)示例程序(如简单的聊天程序)

  1. 服务器端代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <arpa/inet.h>int main() {int sockfd, clientfd;struct sockaddr_in server_addr, client_addr;socklen_t client_len;char buffer[1024];// 创建TCP套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket");exit(1);}// 绑定地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);server_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("bind");close(sockfd);exit(1);}// 监听连接if (listen(sockfd, 5) < 0) {perror("listen");close(sockfd);exit(1);}printf("Server is listening on port 8080...\n");// 接受连接client_len = sizeof(client_addr);clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);if (clientfd < 0) {perror("accept");close(sockfd);exit(1);}printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));// 通信循环while (1) {// 接收客户端数据int n = recv(clientfd, buffer, sizeof(buffer), 0);if (n < 0) {perror("recv");break;} else if (n == 0) {printf("Client disconnected\n");break;}buffer[n] = '\0';printf("Received from client: %s\n", buffer);// 发送数据到客户端send(clientfd, buffer, strlen(buffer), 0);}// 关闭套接字close(clientfd);close(sockfd);return 0;
    }
    
  2. 客户端代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <arpa/inet.h>int main() {int sockfd;struct sockaddr_in server_addr;char buffer[1024];// 创建TCP套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket");exit(1);}// 设置服务器地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);// 连接到服务器if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("connect");close(sockfd);exit(1);}printf("Connected to server at 127.0.0.1:8080\n");// 通信循环while (1) {// 从用户输入数据printf("Enter message: ");fgets(buffer, sizeof(buffer), stdin);buffer[strcspn(buffer, "\n")] = '\0';// 发送数据到服务器send(sockfd, buffer, strlen(buffer), 0);// 接收服务器响应int n = recv(sockfd, buffer, sizeof(buffer), 0);if (n < 0) {perror("recv");break;} else if (n == 0) {printf("Server disconnected\n");break;}buffer[n] = '\0';printf("Received from server: %s\n", buffer);}// 关闭套接字close(sockfd);return 0;
    }
    

三、基于UDP的网络编程

(一)UDP套接字的创建与使用

  1. 创建UDP套接字

    • 通过调用socket()函数创建UDP套接字:
      int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
      
      其中,AF_INET表示使用IPv4地址族,SOCK_DGRAM表示使用UDP协议。
  2. 绑定地址

    • 通过调用bind()函数将套接字绑定到一个地址和端口:
      struct sockaddr_in addr;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(port);
      addr.sin_addr.s_addr = INADDR_ANY;
      bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
      
      其中,port是服务器的端口号,INADDR_ANY表示绑定到所有可用的网络接口。
  3. 发送和接收数据

    • 通过调用sendto()recvfrom()函数发送和接收数据:
      sendto(sockfd, data, size, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
      recvfrom(sockfd, buffer, size, 0, (struct sockaddr *)&client_addr, &client_len);
      
      其中,data是要发送的数据,size是数据的大小,buffer是接收数据的缓冲区,server_addr是服务器的地址信息,client_addr是客户端的地址信息,client_len是客户端地址信息的长度。
  4. 关闭套接字

    • 通过调用close()函数关闭套接字:
      close(sockfd);
      

(二)UDP编程的特点与应用场景

  1. 特点

    • 无连接:UDP协议是无连接的,发送方在发送数据前不需要建立连接,接收方在接收数据前也不需要建立连接。这使得UDP协议的开销较小,适合对实时性要求较高的应用。
    • 不可靠:UDP协议不提供可靠传输机制,不保证数据的正确传输。如果数据在传输过程中丢失或出错,UDP协议不会进行重传。
    • 简单:UDP协议的实现相对简单,协议开销较小,适合对实时性要求较高的应用,如视频会议、音频广播等。
    • 支持多播:UDP协议支持多播通信,可以向多个目标地址同时发送数据。
  2. 应用场景

    • 实时应用:UDP协议适合对实时性要求较高的应用,如视频会议、音频广播等。这些应用对数据的实时性要求较高,允许一定程度的数据丢失。
    • 简单应用:UDP协议适合实现简单的网络应用,如DNS查询、SNMP等。这些应用对协议的开销要求较低,不需要复杂的可靠传输机制。
    • 多播应用:UDP协议支持多播通信,适合向多个目标地址同时发送数据的应用,如多播视频会议、多播音频广播等。

四、总结

网络编程是计算机网络中的重要组成部分,涉及客户端与服务器模型、套接字编程、基于TCP的网络编程和基于UDP的网络编程等多个方面。客户端与服务器模型是一种常见的网络应用架构,客户端通过网络向服务器发送请求,服务器处理请求后返回响应。套接字是网络编程中的基本概念,用于实现网络通信。基于TCP的网络编程通过创建TCP套接字,实现可靠的、面向连接的通信服务;基于UDP的网络编程通过创建UDP套接字,实现不可靠的、无连接的通信服务。

通过学习网络编程的基础知识,我们可以更好地理解网络编程的基本概念和实现方法,为后续的网络应用开发打下坚实的基础。

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

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

相关文章

在纯servlet项目中,使用@WebFilter定义了多个filter,如何设置filter的优先级

在纯 Servlet 项目中&#xff0c;WebFilter 注解本身并不提供直接的属性来设置过滤器的优先级&#xff08;如过滤器执行的顺序&#xff09;。但是&#xff0c;你可以通过以下几种方式来控制过滤器的执行顺序&#xff1a;1. 通过 web.xml 配置过滤器的顺序在 web.xml 中&#xf…

关于鸦片战争的历史

19世纪&#xff0c;英国东印度公司获得了鸦片贸易的垄断权&#xff0c;而犹太人是东印度公司的主要投资人之一&#xff0c;英国东印度公司又将鸦片经营权外包给了犹太人。其中&#xff0c;塞法迪犹太人控制了主要的鸦片交易&#xff0c;著名的沙逊家族就是当时臭名昭著的犹太鸦…

Maven - 并行安全无重复打包构建原理揭秘

作者&#xff1a;唐叔在学习 专栏&#xff1a;唐叔的Java实践 标签&#xff1a; #Maven并行构建 #Maven多线程打包 #Java构建优化 #Maven性能调优 #CI/CD加速 #Maven反应堆原理 #避免重复编译 #高并发构建 文章目录一、遇到问题&#xff1a;并行打包会不会翻车&#xff1f;二、…

phpyun人才系统v7.1使用升级补丁怎么从授权版升级至vip版?我说下我的技巧有资源的可以看过来,这样就不用花钱麻烦官方了,新版本照样支持小程序源码

前:这个方法我只在Phpyun 的7.x系列使用过&#xff0c;低于这个版本的我暂时没有研究过&#xff0c;我感觉大同小异&#xff01; 一. 升级前提条件 无论现在你使用的是商业版还是学习版 想垮系列升级你必须有对应的升级补丁&#xff0c;比如说你是授权版或旗舰版 想升级到最新的…

P13014 [GESP202506 五级] 最大公因数

题目描述对于两个正整数 a,b&#xff0c;他们的最大公因数记为 gcd(a,b)。对于 k>3 个正整数 c1​,c2​,…,ck​&#xff0c;他们的最大公因数为&#xff1a;gcd(c1​,c2​,…,ck​)gcd(gcd(c1​,c2​,…,ck−1​),ck​)给定 n 个正整数 a1​,a2​,…,an​ 以及 q 组询问。对…

【机器学习-4】 | 集成学习 / 随机森林篇

集成学习与随机森林学习笔记 0 序言 本文将系统介绍Bagging、Boosting两种集成学习方法及随机森林算法&#xff0c;涵盖其原理、过程、参数等内容。通过学习&#xff0c;你能理解两种方法的区别&#xff0c;掌握随机森林的随机含义、算法步骤、优点及关键参数使用&#xff0c;明…

深入 Go 底层原理(十二):map 的实现与哈希冲突

1. 引言map 是 Go 语言中使用频率极高的数据结构&#xff0c;它提供了快速的键值对存取能力。虽然 map 的使用非常简单&#xff0c;但其底层的实现却是一个精心设计的哈希表&#xff0c;它需要高效地处理哈希计算、数据存储、扩容以及最关键的——哈希冲突。本文将解剖 map 的底…

Reinforcing General Reasoning without Verifiers

1.概述 DeepSeek-R1-Zero [10] 最近展示了使用可验证奖励的强化学习(RL)训练大型语言模型(LLMs)可以极大地提高推理能力。在这个可验证奖励的强化学习(RLVR)框架 [17] 中,LLM 生成一个推理过程(即,思维链,CoT),然后给出最终答案。一个基于规则的程序随后提取并评估…

Hyperbrowser MCP:重新定义网页抓取与浏览器自动化的AI驱动工具

在数据驱动的时代,网页内容的高效处理和自动化操作成为开发者和企业关注的焦点。Hyperbrowser MCP(Model Context Protocol Server)作为一款革命性的工具,通过AI与浏览器技术的深度融合,为网页抓取、结构化数据提取和浏览器自动化提供了全新的解决方案。无论你是需要从复杂…

关于Web前端安全防御XSS攻防的几点考虑

作为一位前端老鸟&#xff0c;总结一下web前端安全领域基础概念、防御策略、框架实践及新兴技术等几个维度的考虑。一、基础概念与核心漏洞1.XSS 攻击XSS&#xff08;跨站脚本攻击&#xff09;是 Web 前端安全中最常见的威胁之一&#xff0c;其核心是攻击者将恶意脚本注入到网页…

eSIM技术深度解析:从物理芯片到数字革命

当苹果公司在2018年首次在iPhone XS系列中引入eSIM技术时&#xff0c;许多用户可能并未意识到这个看似微小的改变将带来怎样的技术革命。从1991年第一张信用卡大小的SIM卡&#xff0c;到今天仅有5mm x 5mm的eSIM芯片&#xff0c;这不仅仅是尺寸的缩小&#xff0c;更是移动通信技…

通俗易懂解释Java8 HashMap

我们来用通俗易懂的方式解释一下 Java 8 中 HashMap 的原理&#xff0c;让你对它的结构、运行机制有清晰的理解。&#x1f333; 什么是 HashMap&#xff1f; HashMap 是 Java 中非常常用的数据结构&#xff0c;用于存储键值对&#xff08;key-value&#xff09;。你可以把它理解…

macOS安装配置Unbound DNS完整指南

文章目录macOS安装配置Unbound DNS完整指南&#x1f3af; 为什么选择Unbound&#xff1f;&#x1f4cb; 系统要求&#x1f680; 安装步骤1. 使用Homebrew安装2. 查看安装信息⚙️ 基础配置1. 备份默认配置2. 创建基础配置文件3. 基础配置内容配置53端口版本&#xff08;高级用户…

学习模板元编程(2)std::true_type/false_type

目录 实现原理 应用场景 条件编译 通过特化和继承&#xff0c;实现std::is_xxx系列 思路 举例 例子1&#xff0c;is_bool 例子2&#xff0c;is_ptr 实现原理 std::true_type/false_type是模板intergral_constant的两种实现&#xff1a; using true_type integral_co…

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models论文阅读笔记

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 摘要 本文探索了思维链&#xff08;chain of thought&#xff09;&#xff0c;即一系列中间推理过程&#xff0c;可以有效地增强大语言模型的复杂推理能力。 在三个大型语言模型上的实验表明&#xff0…

华为核心交换机S7700的内存OID

华为S7700系列交换机 SNMP内存相关OID说明 以下列出了华为S7700核心交换机在SNMP v2c下可用的内存相关OID,包括CPU内存利用率、物理内存总量、已用内存和空闲内存,并给出每个OID的功能描述、数据类型、单位、使用说明等信息。 1. CPU内存利用率(处理器内存占用百分比) OID名…

中州养老Day02:服务管理护理计划模块

本日任务:服务管理的后端开发 1.学习:护理项目 (1)评估开发工期的思路和注意事项 全面熟悉项目,了解项目重点,设置开发优先级 比如,在下面图片的接口文档中版本有1.0,2.0,3.0也就是功能的初代,二代,三代,所以我们在大致浏览所有功能后,要优先关注初代功能的实现 开发计划 …

JavaScript:Ajax(异步通信技术)

一、Ajax 核心概念Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种异步通信技术&#xff0c;核心特点&#xff1a;无刷新更新&#xff1a;无需重新加载整个页面异步处理&#xff1a;后台发送/接收数据不阻塞用户数据格式&#xff1a;支持 XML/JSON/HTML/纯…

leetcode 118. 杨辉三角 简单

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。示例 1:输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows 1 输出: [[1]]提示:1 < numRows…

jmeter--While控制器--循环直到接口响应符合条件

场景描述业务场景&#xff1a;单据计算接口情况&#xff1a;单据计算&#xff0c;调用接口1发起计算&#xff0c;接口2查询计算执行结果jmeter脚本&#xff1a;把接口1和接口2&#xff08;接口2循环调用&#xff0c;直到返回执行完成状态&#xff09;添加到一个事务&#xff0c…