当前位置: 首页 > news >正文

【C语言教程】【常用类库】(十五)网络编程 - <sys/socket.h> 和 <netinet/in.h>

15. 网络编程 - <sys/socket.h><netinet/in.h>

网络编程在C语言中是通过套接字来实现的,套接字提供了进程间通信的端点。C语言的网络编程涉及到创建套接字、绑定地址、监听和接收数据。以下是网络编程的关键概念和基本实现方法。

15.1. 套接字基础
15.1.1. 套接字类型与协议

套接字是网络通信的基础,它分为不同的类型和协议:

  • 套接字类型

    • 流套接字(SOCK_STREAM:基于TCP协议,提供可靠的双向字节流通信。
    • 数据报套接字(SOCK_DGRAM:基于UDP协议,无连接,面向消息,通信时不保证消息顺序和完整性。
  • 协议

    • TCP(传输控制协议):提供可靠、有序的字节流服务,比如HTTP。
    • UDP(用户数据报协议):提供较低效能的、不可靠的数据报服务,比如DNS查询。
15.1.2. 创建和绑定套接字:socket, bind

创建套接字并绑定到指定IP和端口是建立网络服务的基础步骤。

  • socket 函数:用于创建一个新的套接字。

    int socket(int domain, int type, int protocol);
    
    • domain:地址族,一般为 AF_INET(IPv4)或 AF_INET6(IPv6)。
    • type:套接字类型,如 SOCK_STREAM(TCP)或 SOCK_DGRAM(UDP)。
    • protocol:通常设为 0,自动匹配。
  • bind 函数:将套接字与特定IP地址和端口绑定。

    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    
    • sockfd:由 socket 返回的文件描述符。
    • addr:IP地址和端口信息结构体,通常为 struct sockaddr_in
    • addrlen:地址结构体的长度。
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字 [1]struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr)); // 清零server_addr.sin_family = AF_INET; // IPv4server_addr.sin_addr.s_addr = INADDR_ANY; // 任意可用的接口server_addr.sin_port = htons(8080); // 绑定端口8080bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字 [2]return 0;
}
  • [1]创建套接字:使用 socket 函数创建TCP套接字。IPv4地址AF_INET,流套接字类型。
  • [2]绑定套接字bind 函数将创建的套接字绑定到结构体中指定的IP地址和端口上。
15.2. 客户端与服务器模型
15.2.1. TCP 服务器:listen, accept

在创建并绑定了套接字后,服务器需要监听连接和接受请求。

  • listen 函数:将套接字设置为被动监听状态。

    int listen(int sockfd, int backlog);
    
    • sockfd:套接字描述符。
    • backlog:等待连接队列的最大长度。
  • accept 函数:从连接队列中取出一个连接请求。

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    
    • sockfd:监听中的套接字。
    • addr:客户机的IP地址和端口信息。
    • addrlen:用户提供的地址结构的大小。
listen(sockfd, 5); // 开始监听 [3]
struct sockaddr_in client_addr;
socklen_t addrlen = sizeof(client_addr);
int client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen); // 接受连接 [4]
  • [3]监听连接listen 将套接字置为监听状态。
  • [4]接受连接accept 从队列中取出一个连接。
15.2.2. TCP 客户端:connect

客户端需要连接到服务端的指定地址和端口。

  • connect 函数:用于连接到服务端。
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    
    • sockfd:套接字描述符。
    • addr:服务端的 IP 地址和端口信息。
    • addrlen:服务器地址信息的结构体大小。
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr)); // 清空地址
server_addr.sin_family = AF_INET; // IPv4
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); // IP 地址 [5]
server_addr.sin_port = htons(8080); // 目标端口
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 发起连接请求 [6]
  • [5]设置地址:使用 inet_pton 设置目标服务的 IP。
  • [6]发起连接请求connect 连接到指定服务器。
15.2.3. 数据传输:send, recv

一旦连接建立,服务端和客户端之间就可以通过以下函数进行数据传输。

  • send 函数:用于发送数据。

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    
    • sockfd:套接字描述符。
    • buf:要发送的缓冲区。
    • len:缓冲区长度。
    • flags:传输标志,通常设置为0
  • recv 函数:用于接收数据。

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    

    用法与 send 类似。

char buffer[1024];
send(client_sockfd, "Hello, World!", 13, 0); // 发送信息 [7]
recv(client_sockfd, buffer, sizeof(buffer), 0); // 接收信息 [8]
  • [7]发送信息:使用 send 传输数据。
  • [8]接收信息:使用 recv 接收数据。
15.3. 高级套接字编程
15.3.1. 多路复用:select, poll

多路复用允许程序在一个线程中监视多个文件描述符上的事件。

  • select 函数:用于监视多个文件描述符。

    int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
    
  • poll 函数:与 select 相似,使用 pollfd 结构体数组。

    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
    
15.3.2. UDP 套接字编程

UDP 套接字不需要连接,可以直接使用 sendtorecvfrom

  • sendto 函数:用于发送UDP数据包。

    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
    
  • recvfrom 函数:用于接收UDP数据包。

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
    
char udp_buffer[1024];
struct sockaddr_in dest_addr;
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
inet_pton(AF_INET, "192.168.1.1", &dest_addr.sin_addr);
dest_addr.sin_port = htons(9090);
sendto(sockfd, "UDP message", 11, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); // 发送UDP [9]
recvfrom(sockfd, udp_buffer, sizeof(udp_buffer), 0, NULL, NULL); // 接收UDP [10]
  • [9]发送UDP: 使用 sendto 发出数据。
  • [10]接收UDP: 使用 recvfrom 接收UDP数据。

通过这些概念和代码示例,你可以开始进行C语言的网络编程,创建基本的网络应用程序。无论是客户端还是服务器端处理,正确使用这些网络编程API是至关重要的。

相关文章:

【C语言教程】【常用类库】(十五)网络编程 - <sys/socket.h> 和 <netinet/in.h>

15. 网络编程 - <sys/socket.h> 和 <netinet/in.h> 网络编程在C语言中是通过套接字来实现的&#xff0c;套接字提供了进程间通信的端点。C语言的网络编程涉及到创建套接字、绑定地址、监听和接收数据。以下是网络编程的关键概念和基本实现方法。 15.1. 套接字基础…...

正点原子讲解SPI学习,驱动编程NOR FLASH实战

配置SPI传输速度时&#xff0c;需要先失能SPI,__HAL_SPI_DISABLE,然后操作SPI_CR1中的波特率设置位&#xff0c;再使能SPI, NM25Q128驱动步骤 myspi.c #include "./BSP/MYSPI/myspi.h"SPI_HandleTypeDef g_spi1_handler; /* SPI句柄 */void spi1_init(void) {g_spi…...

低代码开发助力中小企业数字化转型难度持续降低

随着信息技术的飞速发展&#xff0c;数字化转型已成为企业持续发展的关键驱动力。对于中小企业而言&#xff0c;数字化转型不仅意味着提升效率、降低成本&#xff0c;更是实现业务模式创新和市场竞争力提升的重要途径。然而&#xff0c;传统软件开发模式的高成本、长周期和复杂…...

【Linux】:线程控制

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来线程控制相关代码和知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…...

大数据-174 Elasticsearch Query DSL - 全文检索 full-text query 匹配、短语、多字段 详细操作

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

Spring Boot视频网站:构建可扩展的视频服务平台

6系统测试 为了保证所开发出来的系统质量过关&#xff0c;让所开发出来的系统具备可靠性并能够投入运行使用&#xff0c;这就需要进行系统开发的最后一个关键步骤&#xff0c;那就是系统测试。可以说系统测试就是对系统开发前面的步骤&#xff0c;比如系统分析与设计等进行复查…...

护眼台灯横评:书客、柏曼、明基哪款使用体验好,又能护眼?

如果你使用过护眼台灯&#xff0c;就太能理解为什么护眼台灯会诞生了。护眼台灯确实有一定的护眼作用&#xff0c;光线柔和不刺眼&#xff0c;许多护眼台灯还有智能调光、定时休息等人性化功能。在当今这个数字化时代&#xff0c;长时间面对电脑屏幕或埋头于书本已成为许多人的…...

RDMA笔记

目录 1. RDMA简介1.1. 比较Socket与RDMA的通信1.2. RDMA优势1.3. RDMA 2. RDMA基本元素2.1. QPSQ, SQE & RQ, RQEQPNQPC 2.2. CQ2.3. MR2.4. PD 3. RDMA基本操作3.1. Send & Receive3.2. RDMA Write3.3. RDMA Read 阅读RDMA相关资料&#xff0c;从硬件开发角度对RDMA作…...

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…...

LabVIEW提高开发效率技巧----跨平台开发

在如今的多平台环境下&#xff0c;开发者常常面临不同操作系统的需求&#xff0c;如Windows、Linux和RT&#xff08;实时&#xff09;系统等。而LabVIEW作为一种强大的开发工具&#xff0c;提供了支持跨平台开发的能力&#xff0c;但要使其无缝迁移&#xff0c;开发者需要掌握一…...

创建uniCloud新项目并且是新服务空间,运行会报Error: Invalid uni-id config file错误

问题说明 新创建的服务空间&#xff0c;新起的项目&#xff0c;运行查询数据库就会报错&#xff0c;Uncaught (in promise) Error: Invalid uni-id config file&#xff0c;我记得在原来创建项目的时候&#xff0c;是不需要进行配置的&#xff0c;最近创建新项目出现了这个错误…...

七、IPD 方法论框架(IPD的组织架构)

IPD的组织架构 在IPD(集成产品开发)方法论中,组织架构是确保跨职能团队高效协作、快速响应市场需求的关键要素之一。IPD的组织架构通常打破传统的职能部门隔离,倡导跨职能团队和矩阵式管理模式,使各职能部门在项目开发中紧密合作,从而提高开发效率,降低沟通成本。 IPD…...

iPad mini 7惨遭暗砍一刀

大屏是工作&#xff0c;小屏才是生活。 iPad mini系列&#xff0c;一直被誉为最适合普罗大众的平板。热爱学习、工作的卷王不多&#xff0c;沉迷游戏、追剧的俗人不少。 对娱乐场景而言&#xff0c;便携性是核心属性。iPad mini不大不小&#xff0c;只有两台手机的大小&#x…...

【计算机网络 - 基础问题】每日 3 题(三十六)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…...

Docker镜像

Docker是一个开源的容器化平台&#xff0c;它可以帮助开发人员打包应用程序及其依赖项为轻量级、可移植的容器&#xff0c;以实现快速部署和可扩展性。下面是关于Docker的一些基本概念和优势&#xff1a; 容器&#xff1a;Docker使用容器来封装应用程序和其所有依赖项&#xff…...

Golang | Leetcode Golang题解之第478题在圆内随机生成点

题目&#xff1a; 题解&#xff1a; type Solution struct {radius, xCenter, yCenter float64 }func Constructor(radius, xCenter, yCenter float64) Solution {return Solution{radius, xCenter, yCenter} }func (s *Solution) RandPoint() []float64 {r : math.Sqrt(rand.…...

菜鸟笔记006 截图识别文字插件 textOCR

随手可得的截图识别文字插件 textOCR&#xff0c;识别出来的文字可直接输入到illustrator的当前文档中&#xff1a; 执行条件 1、需截图软件支持&#xff0c;推荐笔记截图工具 2、截好图片直接拖入面板即可完成识别 ****后期可完成实现在illustrator选择图片对象完成文字识别。…...

MySQL【知识改变命运】07

MySQL 1&#xff1a;Group by 分组查询1.1&#xff1a;语法&#xff1a;1.2&#xff1a;练习 2&#xff1a;having⼦句3回顾&#xff1a;3&#xff1a;内置函数3.1 :⽇期函数 1&#xff1a;Group by 分组查询 可以根据某列&#xff0c;进行分组查询&#xff0c;比如学校里面的…...

Matlab自学笔记三十八:日期时间序列的创建方法

1.概念 时间序列是指&#xff0c;某一时间段的时间&#xff0c;也就是说&#xff0c;一组日期时间数据组成的序列&#xff0c;例如&#xff0c;1.1~1.10&#xff0c;1点~5点等&#xff0c;在Matlab中&#xff0c;使用向量表示这种时间序列&#xff0c;例如[2025.1.1 2025.1.2 …...

fiber的原理

React Fiber 的主要原理包括动态优先级、可中断的工作、增量渲染和协作式多任务 React Fiber 是 React 16 引入的一种新的协调&#xff08;reconciliation&#xff09;引擎&#xff0c;它旨在提高 React 应用的性能和响应性。Fiber 的核心原理主要包括以下几个方面&#xff1a…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...