C语言网络编程——基础

article/2025/9/26 16:53:25

OSI七层参考模型

是理想化的并没有完全实现的模型。
应用层
提供响应的应用服务

表示层
数据的表示和加密

会话层
建立会话关系

传输层
通过传输协议传输数据

网络层
实现跨子网通信,路由转发,维护路由表。

数据链路层
实现以太网内数据帧的转发

物理层
按照一定的传输规则传输电信号。

TCP/IP 四层模型

详细介绍见https://blog.csdn.net/Stars____/article/details/108694074

SCTP协议:TCP的升级版

TCP/IP 网络编程

unix域套接字:用于本地进程间的通信。

  1. Socket:是一个特殊的文件描述符。是一种通用的网络编程的接口。

    1. 在OSI模型中处于会话层和传输层之间。
    2. 在TCP/ IP模型中处于应用层和传输层之间。
    3. int socket(int family, int type, int protocol); 流式套接字(TCP)、数据包套接字(UDP)
      在这里插入图片描述
      在这里插入图片描述
  2. IP地址

    1. ipv4转换函数有inet_aton()、inet_addr()和inet_ntoa()
    2. ipv4和ipv6兼容的函数有inet_pton()和inet_ntop()
    3. 将strptr转换位网络字节序二进制值,仅适用于IPV4,此函数不能用于255.255.255.255的转换。在这里插入图片描述
    4. pton能正确的处理255.255.255.255的转换问题。在这里插入图片描述
    5. pton的逆用 在这里插入图片描述
    6. sa_family结构体定义在 #include <netinet/in.h> 中。在这里插入图片描述
  3. 端口

  4. 字节序

    1. 本地字节序和网络字节序是不一样的。所以需要转换。
    2. 字节序转换涉及4个函数:htons()、ntohs()、htonl()、ntohl()。h代表host,n代表network,s代表short,l代表long在这里插入图片描述
    3. bind():该函数将保存在相应地址结构中的地址信息与套接字进行绑定。它主要用于服务器端,客户端创建的套接字可以不绑定地址。在这里插入图片描述
    4. listen():在服务端程序成功建立套接字并与地址进行绑定后,通过调用listen函数将套接字设置成监听模式(被动的),准备接收客户端的连接请求。在这里插入图片描述
    5. accept():服务端通过调用accept函数等待并接受客户端的连接请求。建立好TCP连接后,该函数会返回一个新的已连接套接字。在这里插入图片描述
    6. connect():客户端通过该函数向服务器端的监听套接字发送连接请求。在这里插入图片描述
    7. send()和recv():用于TCP和UDP通信过程中发送和接收数据。在这里插入图片描述在这里插入图片描述
    8. sendto()和recvfrom():这两个函数一般用与UDP中的发送和接收,当用在TCP中时后面与地址有关的参数不起作用。函数作用等同于send()和recv()在这里插入图片描述在这里插入图片描述
    9. 通用结构体:
struct sockaddr{sa_family_t sa_family;  //协议char 		sa_data[14]; 
};
  1. AF_INET定义结构体
struct sockaddr_in{sa_family_t sin_family; // 协议in_port_t	sin_port;	// 端口号的网络字节序struct in_addr sin_addr;// 
};struct in_addr{uint32_t	 s_addr; // IP地址 网络字节序
};

服务端

#include "net.h"#define BUFF_SIZE 128int main(int argc, char* argv[])
{int listenfd, connfd;struct sockaddr_in servaddr, cliaddr;socklen_t peerlen;char buf[BUFF_SIZE];if(argc < 3){printf("入参有误!\n");return -1;}// 建立socket连接if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}printf("listenfd = %d\n", listenfd);// 设置sockaddr_in 结构体中的相关参数bzero(&servaddr, sizeof(servaddr)); // 擦除内存 全写0servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2]));servaddr.sin_addr.s_addr = inet_addr(argv[1]);// 绑定函数if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){perror("bind");return -1;}printf("bind success!\n");// 调用listen()函数,设置监听模式if(listen(listenfd, 10) == -1){perror("listen");return -1;}printf("listening...\n");// 调用accept函数,等待客户端的连接peerlen = sizeof(cliaddr);while(1){if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr, &peerlen)) < 0){perror("accept");return -1;}bzero(buf, sizeof(buf));if(recv(connfd, buf, BUFF_SIZE, 0) == -1){perror("recv");return -1;}printf("Received a message: %s\n", buf);strcpy(buf, "Welcome to server");send(connfd, buf, BUFF_SIZE, 0);close(connfd);}close(listenfd);return 0;
}

客户端

#include "net.h"#define BUFF_SIZE 128int main(int argc, char* argv[])
{int sockfd;char buf[BUFF_SIZE] = "Hello server";struct sockaddr_in servaddr;if(argc < 3){printf("入参有误!\n");return -1;}// 创建socketif((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}// 设置sockaddr_in结构体中相关参数bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2]));servaddr.sin_addr.s_addr = inet_addr(argv[1]);// 调用connect函数向服务器发送连接请求if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){perror("connect");return -1;}// 发送消息给服务端send(sockfd, buf, sizeof(buf), 0);if(recv(sockfd, buf, BUFF_SIZE, 0) == -1){perror("recv");return -1;}printf("recv from server : %s\n", buf);close(sockfd);return 0;
}

TCP服务端客户端流程图

在这里插入图片描述

一个服务器服务多个客户端的TCP编程

主要还是对服务器端的优化。

  1. 循环服务器:分时处理客户端,直到前一个客户端退出后新的客户端才能被服务器响应在这里插入图片描述

  2. 并发服务器:常用多线程实现,进程太过于耗费资源不常用在这里插入图片描述

IO多路复用

在上述并发服务器中使用多线程能满足多个客户端的连接,但是客户端的数量上不能太多,假设有1000个客户端要连接这个服务器,那服务器就得开1000个线程,而且并不是每个客户端都是活跃的,对于那些不活跃的客户端服务器也不能释放线程资源,直到客户端断开连接,这样对服务器来说压力太大。

所以就有了IO多路复用。

多路复用IO
下一篇详细讲!


http://chatgpt.dhexx.cn/article/nathir2U.shtml

相关文章

matlab 神经网络编程入门系列(1)

本文主要内容包括&#xff1a; (1) 介绍神经网络基本原理&#xff0c;(2) Matlab实现前向神经网络的方法 。 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。 由于英文的类无法识别&#xff0c;故需要把对应的类用数字标识&#xff0c;数据集变成&…

WinPcap网络编程入门——0. 环境配置及系列介绍

WinPcap网络编程入门——0. 环境配置及系列介绍 系列教程章节直达&#xff1a; Winpcap网络编程入门——1. 获取设备列表&#xff1b; 说明&#xff1a;本教程适用于网络编程开发人员入门&#xff0c;将从底层分析 WinPcap 的执行过程&#xff0c;结合一些实际用例来学习 WinP…

Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

目录 1 网络编程入门1.1 网络编程概述1.2 网络编程三要素1.3 IP地址1.4 InetAddress的使用1.5 端口1.6 协议 2 UDP通信程序2.1 UDP通信原理2.2 UDP发送数据2.3 UDP接收数据2.4 范例 3 TCP通信程序3.1 TCP通信原理3.2 TCP发送数据3.3 TCP接收数据3.4 案例3.4.1 练习一&#xff1…

Java网络编程入门(软件结构、网络通信协议、网络编程三要素)

文章目录 &#x1f415;软件结构&#x1f436;网络通信协议&#x1f981;协议分类&#x1f405;网络编程三要素&#x1f406;协议&#x1f40e;IP地址&#x1f98c;端口号 &#x1f415;软件结构 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结…

黑客编程入门 之 网络编程入门

网络编程入门 前言Socket技术详细介绍Socket 编程所需函数服务器/客户 代码 前言 “任何职业都可以成为黑客。你可以是一个木匠黑客。不一定是高科技。只要与技能有关&#xff0c;并且倾心专注于你正在做的事情&#xff0c;你就可能成为黑客。” ——引自《黑客伦理与信息时代精…

WinPcap网络编程入门——1. 获取设备列表

WinPcap网络编程入门——1. 获取设备列表 系列教程章节直达&#xff1a; Winpcap网络编程入门——1. 获取设备列表&#xff1b; 上节中我们简单介绍了 WinPcap 的相关资料&#xff0c;配置好了开发环境&#xff0c;现在就让我们正式开始网络编程开发吧&#xff01; 1. 基本开…

网络编程入门(代码很详细)

网络编程 1.1概述 计算机网络&#xff1a;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算…

网络编程——(1)网络编程入门

一、软件架构 1.1C/S结构&#xff1a; 全称Client/Server结构&#xff0c;是指客户端和服务器结构。常见的程序有QQ、迅雷等。 1.2 B/S结构&#xff1a; 全称为Browser/Server结构&#xff0c;是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 两种架构各有优势&#xf…

网络编程入门

1.网络编程入门 1.1网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统 网…

线性代数学习笔记——第六讲——矩阵的转置

1. 矩阵转置的定义&#xff08;矩阵的行和列互换位置&#xff09; 2. 矩阵转置的性质之一&#xff1a;矩阵转置一次后再转置一次&#xff0c;等于矩阵自身&#xff08;有点像一个两状态开关&#xff0c;在开与关之间来回切换&#xff09; 3. 对称矩阵的充要条件是矩阵转置一次后…

转置矩阵、对称矩阵、反对称矩阵以及向量的反对称矩阵

一、转置矩阵 假设矩阵 A 如下表示&#xff1a; 则其转置矩阵表示为&#xff1a; 二、对称矩阵 若矩阵 B 与其转置矩阵相等&#xff0c;则称矩阵 B 为对称矩阵&#xff0c;如&#xff1a; 三、反对称矩阵 若矩阵 C 与其转置矩阵取负后相等&#xff0c;则称矩阵 C 为反对称矩…

Java编程之转置矩阵

一、题目 利用随机函数产生36个10~30之间的整数给一个6*6的矩阵赋值。 &#xff08;1&#xff09;求最大元素&#xff0c;并指出其在矩阵中的所有出现位置&#xff1b; &#xff08;2&#xff09;求该矩阵的转置矩阵。 二、实验代码 package fighting; import java.util.Rand…

FPGA 矩阵转置

这里写目录标题 1 功能2 开发环境3 框架4 转置公式5 Simulation第一部分第二部分第三部分 6 Matlab代码产生FIFO数据产生转置矩阵 7 HDL仿真文件顶层文件FIFO顶层文件FIFO读FIFO写RAM顶层文件 8 IP配置FIFORAMROM 9 Reference 1 功能 通过tb读取本地数据保存到FIFO&#xff0c…

MATLAB的转置

小席的碎碎叨&#xff1a;   以前处理的数据通常都是实数矩阵&#xff0c;一直认为MATLAB中的转置可用实现&#xff0c;并没有发现有什么不对。但是&#xff0c;这段时间在做线性调频信号的干扰抑制的仿真&#xff0c;其信号矩阵都是复数矩阵&#xff0c;依然在需要转置的时候…

矩阵转置(transpose、T)

1.T T 适用于一、二维数组的转置 transpose 适用于高维数组&#xff0c;需要用到一个由轴编号组成的元组&#xff0c;才能进行转置 In [1]: import numpy as npIn [2]: arr np.arange(20).reshape(4,5)#生成一个4行5列的数组In [3]: arr Out[3]: array([[ 0, 1, 2, 3, 4]…

线性代数:转置矩阵(matrix transpose)和逆矩阵(matrix inverse)

这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T*齐次坐标V 齐次坐标V 其计算细节也就是矩阵行与向量列的点积&#xf…

转置矩阵(matrix transpose)和逆矩阵(matrix inverse)的相关公式

转载自: https://blog.csdn.net/yinhun2012/article/details/84236202 这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T…

转置矩阵(Transpose of a matrix)

定义 给定一个矩阵 A&#xff0c;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff0c;记为 &#xff0c;。转置矩阵的行列式不变&#xff0c;即 。转置矩阵由下列动作建立&#xff1a; 将 A 的横行写为 的纵列&#xff1b;将 A 的纵列写成 的横行。 形式来说&#xff0…

数据结构--3.3 矩阵转置

矩阵转置 结构体创建初始化转置打印测试代码运行结果 1.稀疏矩阵的压缩存储&#xff0c;至少需要存储以下信息&#xff1a; 矩阵中各非 0 元素的值&#xff0c;以及所在矩阵中的行标和列标&#xff1b; 矩阵的总行数和总列数&#xff1b; 上图是一个稀疏矩阵&#xff0c;若对…

D2D与其他短距离通信技术

本篇文章主要对D2D和其他短距离通信技术&#xff08;WIFI\NFC\zigbee\蓝牙、超宽带、微站&#xff09;做了比较&#xff0c;从运营商投入、基础设施、应用、最大传输速率、最大传输距离、频率、标准、特征等方面