C语言高手参考手册:网络编程高级话题与技术细节

在这里插入图片描述

在上一篇文章中,我们介绍了基本的网络编程概念和操作。本文将深入探讨网络编程的一些高级话题和技术细节,包括错误处理、非阻塞I/O、多路复用(select/poll/epoll)、套接字选项以及安全编程等。

1. 错误处理

1.1 错误码

在处理网络编程中的错误时,通常需要检查函数的返回值,并利用 errno 获取具体的错误原因。

1.2 示例代码

#include <sys/socket.h>
#include <errno.h>
#include <stdio.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Failed to create socket");return EXIT_FAILURE;}// 其他操作...// 错误处理if (some_function() == -1) {perror("Some function failed");return EXIT_FAILURE;}// 关闭Socketif (close(sockfd) == -1) {perror("Failed to close socket");return EXIT_FAILURE;}return 0;
}

2. 非阻塞I/O

2.1 概念

非阻塞I/O允许程序在没有数据可读或写时立即返回,而不是阻塞等待。

2.2 设置非阻塞I/O

#include <fcntl.h>void set_nonblocking(int sockfd) {int flags = fcntl(sockfd, F_GETFL, 0);if (flags == -1) {perror("Failed to get flags");exit(EXIT_FAILURE);}flags |= O_NONBLOCK;if (fcntl(sockfd, F_SETFL, flags) == -1) {perror("Failed to set non-blocking mode");exit(EXIT_FAILURE);}
}

3. 多路复用

3.1 select函数

select() 是最早的多路复用函数,用于检测一组文件描述符的状态。

3.2 poll函数

poll()select() 的改进版本,没有文件描述符限制,并提供了更多的灵活性。

3.3 epoll函数

epoll() 是 Linux 中最高效的多路复用机制,适用于大量文件描述符的情况。

3.4 示例代码

使用select
#include <sys/time.h>
#include <sys/select.h>
#include <unistd.h>void handle_events_with_select(int sockfd) {fd_set readfds;struct timeval timeout;FD_ZERO(&readfds);FD_SET(sockfd, &readfds);timeout.tv_sec = 1;timeout.tv_usec = 0;int ret = select(sockfd + 1, &readfds, NULL, NULL, &timeout);if (ret == -1) {perror("Select failed");exit(EXIT_FAILURE);}if (ret > 0 && FD_ISSET(sockfd, &readfds)) {// 数据可读}
}
使用poll
#include <sys/poll.h>void handle_events_with_poll(int sockfd) {struct pollfd pfd;pfd.fd = sockfd;pfd.events = POLLIN;int ret = poll(&pfd, 1, 1000); // 超时1秒if (ret == -1) {perror("Poll failed");exit(EXIT_FAILURE);}if (ret > 0 && pfd.revents & POLLIN) {// 数据可读}
}
使用epoll
#include <sys/epoll.h>void handle_events_with_epoll(int sockfd) {int epfd = epoll_create1(0);if (epfd == -1) {perror("Failed to create epoll file descriptor");exit(EXIT_FAILURE);}struct epoll_event ev;ev.events = EPOLLIN;ev.data.fd = sockfd;if (epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev) == -1) {perror("Failed to add file descriptor to epoll");exit(EXIT_FAILURE);}struct epoll_event events[10];int num_events = epoll_wait(epfd, events, 10, 1000); // 超时1秒if (num_events == -1) {perror("Epoll wait failed");exit(EXIT_FAILURE);}for (int i = 0; i < num_events; i++) {if (events[i].events & EPOLLIN) {// 数据可读}}if (epoll_ctl(epfd, EPOLL_CTL_DEL, sockfd, NULL) == -1) {perror("Failed to delete file descriptor from epoll");exit(EXIT_FAILURE);}if (close(epfd) == -1) {perror("Failed to close epoll file descriptor");exit(EXIT_FAILURE);}
}

4. 套接字选项

4.1 SO_REUSEADDR

允许在服务器重启后快速重用地址。

4.2 SO_RCVBUF/SO_SNDBUF

设置接收缓冲区和发送缓冲区的大小。

4.3 示例代码

#include <sys/socket.h>void set_socket_options(int sockfd) {int optval = 1;// 设置SO_REUSEADDR选项if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) {perror("Failed to set SO_REUSEADDR option");exit(EXIT_FAILURE);}// 设置接收缓冲区大小int rcvbuf_size = 1024 * 1024; // 1MBif (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf_size, sizeof(rcvbuf_size)) == -1) {perror("Failed to set SO_RCVBUF option");exit(EXIT_FAILURE);}// 设置发送缓冲区大小int sndbuf_size = 1024 * 1024; // 1MBif (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf_size, sizeof(sndbuf_size)) == -1) {perror("Failed to set SO_SNDBUF option");exit(EXIT_FAILURE);}
}

5. 安全编程

5.1 SSL/TLS

使用SSL/TLS协议加密网络通信,保护数据的安全性。

5.2 认证

使用用户名密码或其他认证机制验证客户端身份。

5.3 防火墙

配置防火墙规则以阻止未经授权的网络访问。

6. 总结

网络编程的高级话题和技术细节对于构建高性能和安全的网络应用程序至关重要。通过本文的介绍,相信您已经掌握了如何处理错误、使用非阻塞I/O、实现多路复用、设置套接字选项以及进行安全编程。

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

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

相关文章

[数据集][目标检测]红外场景下车辆和行人检测数据集VOC+YOLO格式19069张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;19069 标注数量(xml文件个数)&#xff1a;19069 标注数量(txt文件个数)&#xff1a;19069 标…

基于B站的热门视频数据分析与情感分析【关联性、主题、情感分析】

目录 2 研究内容 2.1 主要研究内容 2.2 拟解决的关键问题 2.2.1热门视频特征的识别和提取 2.2.2情感分析与用户反馈 2.3技术路线 2.3.1数据收集 2.3.2数据预处理 2.3.3数据挖掘 2.3.4 数据可视化 2.4可行性分析 2.4.1技术可行性 2.4.2数据可行性 2.4.3经济可行性 2.5数据库设计…

[000-01-011].第2节:持久层方案的对比

我的后端学习大纲 MyBatis学习大纲 1.持久层解决方案&#xff1a; 1.1.面试1&#xff1a;请说一说持久层解决方案有哪些&#xff1f;&#xff1f;&#xff1f; 1.jdbc JDBC为访问不同的数据库提供了一种统一的途径&#xff0c;为开发者屏蔽了一些细节问题。Java程序员使用JDB…

关于springboot的异常处理以及源码分析(一)

一、什么是异常处理 1、文档定义 首先我们先来看springboot官方对于异常处理的定义。springboot异常处理 在文档的描述中&#xff0c;我们首先可以看到的一个介绍如下&#xff1a; By default, Spring Boot provides an /error mapping that handles all errors in a sensib…

计算机网络-2-tcpip协议

1.说说 TCP/IP 四层模型&#xff1f; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;模型是一种用于描述互联网通信的协议层次结构。它分为四个主要层次&#xff0c;每个层次都定义了不同的协议来实现特定的功能。下面是TCP/IP模型各层的常用…

Android系统安全 — 1-OpenSSL支持的常用加解密算法介绍

常用加解密算法介绍 1. 哈希算法 常见的函数包含MD系列、SHA-1、SHA-2家族、SHA-3家族、SM3等。 1.1 MD5&#xff08;单向散列算法&#xff09; 全称是Message-Digest Algorithm 5&#xff08;信息-摘要算法&#xff09;&#xff0c;经MD2、MD3和MD4发展而来。MD5算法的使用…

0基础学习Python路径(21)Python NameSpaceScope

命名空间定义了在某个作用域内变量名和绑定值之间的对应关系&#xff0c;命名空间是键值对的集合&#xff0c;变量名与值是一一对应关系。作用域定义了命名空间中的变量能够在多大范围内起作用。 命名空间在 Python 解释器中是以字典的形式存在的&#xff0c;是以一种可以看得…

【快速入门 LVGL】-- 1、STM32 工程移植 LVGL

目录 一、LVGL 简述 二、复制一个STM32工程 三、下载 LVGL 四、裁剪 源文件 五、工程添加 LVGL 文件 六、注册 显示 七、注册 触摸屏 八、LVGL 心跳、任务刷新 九、开跑 LVGL 十、控件的事件添加、响应处理 十 一、几个好玩小事情 十 二、显示中文 ~~ 约定 ~~ 在…

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;讲解风趣幽默&#xff0c;简直让人欲罢不能。忍不住分享给大家&#xff0c;点击这里立刻跳转&#xff0c;开启你的AI学习之旅吧&#xff01; 前言 – 人工智能教程https://www.captainbed.cn/l…

linux文件——用户缓冲区——概念深度探索、IO模拟实现

前言&#xff1a;本篇文章主要讲解文件缓冲区。 讲解的方式是通过抛出问题&#xff0c; 然后通过分析问题&#xff0c; 将缓冲区的概念与原理一步一步地讲解。同时&#xff0c; 本节内容在最后一部分还会带友友们模拟实现一下c语言的printf&#xff0c; fprintf接口&#xff0c…

跨境电商补单秘籍:Lazada、Shopeee、eBay、Wish等平台实战技巧

在跨境电商领域&#xff0c;Lazada、Shopee、eBay、Wish及速卖通等平台为商家提供了广阔的市场空间。为了有效扩大产品的曝光率和提升转化率&#xff0c;商家需充分利用平台活动及营销工具。平台活动不仅是获取流量的关键渠道&#xff0c;还能显著提升品牌知名度。此外&#xf…

Python画笔案例-006 绘制正多边形

1、绘制正多边形 通过 python 的turtle 库绘制一个正多边形的图案&#xff0c;如下图&#xff1a; 2、实现代码 绘制一个正多边形&#xff0c;关键两个因素&#xff0c;一个是边长&#xff0c;决定了图形的大小&#xff1b;另一个就是图形里每个角的角度&#xff0c;绘制多边形…

SSM健康生活博客小程序—计算机毕业设计源码23497

摘 要 本文设计了一种基于SSM框架的健康生活博客小程序&#xff0c;为人们提供了运动视频教学、博客信息分享&#xff0c;用户能够方便快捷地查看资讯、搜索健康方面的相关信息、还能发布个人生活博客等。健康生活博客小程序采取面对对象的开发模式进行软件的开发和硬体的架设&…

Python | Leetcode Python题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution:def canMeasureWater(self, x: int, y: int, z: int) -> bool:if x y < z:return Falseif x 0 or y 0:return z 0 or x y zreturn z % math.gcd(x, y) 0

opencv-python图像增强十一:图像强光逆光调整:

文章目录 一&#xff0c;简介&#xff1a;二&#xff0c;方案简述&#xff1a;三&#xff0c;算法实现步骤&#xff1a;3.1 获得图像的阴影区域&#xff1a;3.2 调整阴影区域的亮度和对比度 四&#xff1a;整体代码五&#xff0c;效果&#xff1a; 一&#xff0c;简介&#xff…

UE5 多个类选择界面生成。解决方案思路。

中控器CC 》用户界面控制器UI_CC 》用户界面UI_Inst 生成 CC使用接口&#xff0c;通知UI_CC开始生成UI_Inst。 蓝图函数库编写判断是否存在和创建UI的蓝图。&#xff08;此处略&#xff09; UI_CC生成时&#xff0c;userwidget使用接口&#xff0c;注册UI_CC的用户控件的控件…

系统编程-信号

6 信号与管道 1 目录 6 信号与管道 1 信号 信号的概念 信号的使用 信号的发送 通过函数来实现信号的发送 信号改造函数(重点) 给自己发送信号函数 定时闹钟函数 暂停进程的函数 例题&#xff1a; 代码一&#xff1a; 代码二&#xff1a; 代码分析 -- linux系统下…

获发明专利加持,隆道加速推进企业级AI应用落地

近期&#xff0c;北京隆道网络科技有限公司研发的“基于供应链管理的AI采购业务分析装置及方法”获得国家发明专利授权。该项新专利的取得&#xff0c;证明了隆道在AI产业化应用中的技术前瞻性和创新性&#xff0c;也为隆道加速企业级AI应用落地提供了知识产权保障。 根据IBM发…

将标准输入stdin转换成命令行参数——Unix中的xargs指令

xargs是Unix中的复合指令加工机&#xff0c;联合管道符“|”将制造更加强大的“复杂”指令组合。 (笔记模板由python脚本于2024年08月22日 18:13:51创建&#xff0c;本篇笔记适合喜欢Linux的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.…

开放式耳机哪个品牌好?分享四款开放式蓝牙耳机排行榜前十名

我相信很多人都会有这些问题&#xff0c;不知道入手什么蓝牙耳机品牌、有线耳机不好收纳、有线耳机不方便携带、蓝牙耳机听歌的音质怎么样、蓝牙耳机是否会对大脑有危害、蓝牙耳机有什么品牌型号推荐以及想要不同价位的蓝牙耳机品牌推荐参考&#xff0c;okok问题也是很多&#…