iNet

C 基于UDP实现一个简易的聊天室

試著忘記壹切 提交于 2020-04-14 09:29:49
【今日推荐】:为什么一到面试就懵逼!>>> 引言    本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少很多. 但是水也很深. 本文就当是一个demo整合帮助开发者回顾和继续了解 linux udp开发的基本流程. 首先我们来看看 linux udp 和 tcp的异同. /* 这里简单比较一下TCP和UDP在编程实现上的一些区别: TCP流程 建立一个TCP连接需要三次握手,而断开一个TCP则需要四个分节。当某个应用进程调用close(主动端)后 (可以是服务器端,也可以是客户 端),这一端的TCP发送一个FIN,表示数据发送完毕;另一端(被动端)发送一 个确认,当被动端待处理的应用进程都处理完毕后,发送一个FIN到主动端,并关闭套接口,主动端接收到这个 FIN后再发送一个确认,到此为止这个TCP连接被断开。 UDP套接口   UDP套接口是无连接的、不可靠的数据报协议;既然他不可靠为什么还要用呢?   其一:当应用程序使用广播或多播是只能使用UDP协议;   其二:由于它是无连接的,所以速度快。因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无 限等待,解决办法是设置一个超时。在编写UDP套接口程序时,有几点要注意

openssl实现双向认证教程(服务端代码+客户端代码+证书生成)

倾然丶 夕夏残阳落幕 提交于 2020-04-14 00:23:40
【今日推荐】:为什么一到面试就懵逼!>>> 一、背景说明 1.1 面临问题 最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击。 《信息安全工程》中接触过双向认证,但有两个问题。 第一个是当时最终的课程设计客户端是浏览器,服务端是tomcat双向认证只需要对两者进行配置并不需要自己真的实现代码。 第二个是虽然课程也有接近双向认证的实现代码,但当时是Java+JCE环境现在要用C+++OpenSSL环境,总体意思确实还是差不多但具体函数和参数差别还是不少。 所以眼下有的是:证书生成的思想+双向认证实现的思想。对读者而言,即要假定已对证书、SSL/TSL、socket编程等几个概念有基本的了解,本文不做详细介绍。 基于此本文要解决的问题是:openssl具体如何生成证书+openssl如何实现双向认证。 1.2 解决办法 1.2.1 openssl具体生成证书解决办法 参考 https://blog.csdn.net/gengxiaoming7/article/details/78505107 再加其他一些文章总结而成 1.2.2 openssl实现双向认证解决办法 使用 https://blog.csdn.net/sardden/article/details/42705897 代码实SSL

openssl实现双向认证教程(服务端代码+客户端代码+证书生成)

守給你的承諾、 提交于 2020-04-13 21:58:05
【今日推荐】:为什么一到面试就懵逼!>>> 一、背景说明 1.1 面临问题 最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击。 《信息安全工程》中接触过双向认证,但有两个问题。 第一个是当时最终的课程设计客户端是浏览器,服务端是tomcat双向认证只需要对两者进行配置并不需要自己真的实现代码。 第二个是虽然课程也有接近双向认证的实现代码,但当时是Java+JCE环境现在要用C+++OpenSSL环境,总体意思确实还是差不多但具体函数和参数差别还是不少。 所以眼下有的是:证书生成的思想+双向认证实现的思想。对读者而言,即要假定已对证书、SSL/TSL、socket编程等几个概念有基本的了解,本文不做详细介绍。 基于此本文要解决的问题是:openssl具体如何生成证书+openssl如何实现双向认证。 1.2 解决办法 1.2.1 openssl具体生成证书解决办法 参考 https://blog.csdn.net/gengxiaoming7/article/details/78505107 再加其他一些文章总结而成 1.2.2 openssl实现双向认证解决办法 使用 https://blog.csdn.net/sardden/article/details/42705897 代码实SSL

Debian 10下修改静态IP

∥☆過路亽.° 提交于 2020-04-13 20:17:58
【今日推荐】:为什么一到面试就懵逼!>>> Debian 10下修改静态IP: 在/etc/network/interfaces 文件后添加(配置IP和网关): allow-hotplug ens33 # iface ens33 inet dhcp auto ens33 iface ens33 inet static address 192.168.0.199 netmask 255.255.255.0 gateway 192.168.0.1 保存重启网络 service networking restart 来源: oschina 链接: https://my.oschina.net/michaelshu/blog/3233342

搞懂Linux下的几种文件类型

回眸只為那壹抹淺笑 提交于 2020-04-13 16:44:21
【今日推荐】:为什么一到面试就懵逼!>>> 在Linux系统下,有七类文件类型: 普通文件(-) 目录(d) 软链接(字符链接L) 套接字文件(S) 字符设备(S) 块设备(B) 管道文件(命名管道P) 普通文件、目录、软链接无需多解释。 管道文件 管道分为 匿名管道和命名管道 。管道都是一端写入、另一端读取,它们是单方向数据传输的,它们的数据都是直接在内存中传输的,管道是进程间通信的一种方式,例如父进程写,子进程读。 在shell中匿名管道就是一个管道符号"|",例如 ls | grep xxx ,其中ls对应的进程是这个独立进程组中的父进程,grep对应的进程是子进程,父进程写子进程读。 在编程语言中,匿名管道是通过创建两个文件句柄或文件描述符(例如A、B)来实现的,一个文件句柄用于写数据(例如A写入端,数据写入A将自动推入B中),另一个文件句柄用于读数据(即B)。 对于命名管道,即有名称的管道,命名管道将文件保留在文件系统中,它也称为FIFO,也就是first in first out。虽然命名管道文件保留在文件系统中,但是这个文件只是使用命名管道的一个入口,在使用命名管道传输数据的时候,仍然是在内存中进行的,也就是说并不会因为保留在文件系统上命名管道的效率就低了。 在shell中,可以使用 mknod 命令或 mkfifo 命令创建命名管道

Perl获取主机名、用户、组、网络信息

耗尽温柔 提交于 2020-04-13 16:19:29
【今日推荐】:为什么一到面试就懵逼!>>> 获取主机名、用户、组、网络信息相关函数 首先是获取主机名的方式,Perl提供了 Sys::Hostname 模块,可以查询当前的主机名: use Sys::Hostname; print hostname, "\n"; Perl中提供了下面一大堆的内置函数用来获取用户、组、网络相关的信息。这些perl函数在C中也都有对应的函数。 # 获取和设置用户和组 endgrent - be done using group file endpwent - be done using passwd file getgrent - get next group record getgrgid - get group record given group user ID getgrnam - get group record given group name getlogin - return who logged in at this tty getpwent - get next passwd record getpwnam - get passwd record given user login name getpwuid - get passwd record given user ID setgrent - prepare group file

Perl进程间通信

三世轮回 提交于 2020-04-13 16:17:56
【今日推荐】:为什么一到面试就懵逼!>>> 不同进程之间的通信或进程间通信(InterProcess Communication, IPC),是一个涉及多个方面的主题。Perl提供了多种进程间通信的方式,本文将逐一介绍。本文的内容主体来自于《Pro Perl》的第21章。 单向管道(unidirectional pipe) 管道是两个文件描述符(文件句柄)通过一根管道连接起来,一端的文件句柄读,另一端的文件句柄写,从而实现进程间的通信。 Perl使用 pipe 函数可以创建单向管道,也就是一端只可读、一端只可写的管道,所以它需要两个文件句柄参数。 pipe READ_FH, WRITE_FH; 默认情况下,Perl会对IO进行缓冲,向写入端文件句柄写入数据时会暂时缓冲在文件句柄的缓冲中,而不会立即放进管道,也就是说读入端无法立即读取到这段数据。对于管道这种数据实时通信的机制, 应该关闭缓冲,而是让它在需要写入数据的时候立即刷到管道中 。 pipe READ_FH, WRITE_FH; # when write to WRITE_FH select WRITE_FH; $| = 1; # 或者使用IO::Handle设置autoflush(1) WRITE_FH->autoflush(1); 下面是一个父子进程间通过单向pipe通信的示例:父进程写、子进程读 #!/usr/bin

Linux网卡/防火墙

ぐ巨炮叔叔 提交于 2020-04-12 20:11:24
网络 网卡命名规则 在Centos6中网卡命名方式:其会根据情况动态变化且非唯一且固定的,其常用的网卡命名方式:eth0,eth1,当网卡增加或者减少的时候网卡名称会发生变化 在Centos7/8网卡命名方式:其会根据 dmidecode 采集命名方案,以此来获取网卡信息,此时网卡的名称固定且唯一 dmidecode :用来收集硬件有关信息 网络设备命名方式 如果Fireware(固件)或者BIOS主板集成的设备提供索引信息可用且可预测,则根据此索引进行命名 例如: ifcfg-ens33 如果Fireware(固件)或者BIOS为PCI-E扩展主板所提供的索引信息可用且可预测,则根据此索引进行命名 例如: ifcfg-enp33 如果硬件接口的屋里信息可用,则根据此信息进行命名,例如:恩enp2s0 以上均不可用的时候则使用传统的命名方式 扩展 ''' 在Centos7/8中,en:表示ethernet表示以太网 enX(X常见有三种类型) O:主板板载网卡,集成设备的设备索引号 P:独立网卡,PCI网卡 S:热插拔网卡,usb之类,扩展槽的索引号 在Centos8中网卡延续了Centos7中的命名方式,例如:ens-XX, 其重启网卡的命令ifdown-ensXX&&ifup-ensXX 其彻底停止了network的使用方式,不能通过network重启所有的网卡 '''

openssl实现双向认证教程(服务端代码+客户端代码+证书生成)

落花浮王杯 提交于 2020-04-12 17:29:55
一、背景说明 1.1 面临问题 最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击。 《信息安全工程》中接触过双向认证,但有两个问题。 第一个是当时最终的课程设计客户端是浏览器,服务端是tomcat双向认证只需要对两者进行配置并不需要自己真的实现代码。 第二个是虽然课程也有接近双向认证的实现代码,但当时是Java+JCE环境现在要用C+++OpenSSL环境,总体意思确实还是差不多但具体函数和参数差别还是不少。 所以眼下有的是:证书生成的思想+双向认证实现的思想。对读者而言,即要假定已对证书、SSL/TSL、socket编程等几个概念有基本的了解,本文不做详细介绍。 基于此本文要解决的问题是:openssl具体如何生成证书+openssl如何实现双向认证。 1.2 解决办法 1.2.1 openssl具体生成证书解决办法 参考 https://blog.csdn.net/gengxiaoming7/article/details/78505107 再加其他一些文章总结而成 1.2.2 openssl实现双向认证解决办法 使用 https://blog.csdn.net/sardden/article/details/42705897 代码实SSL,在其基础上实现双向认证。 双向认证的关键点在以下几个函数

Linux 下epoll 网络模型

橙三吉。 提交于 2020-04-11 08:38:37
为什么需要epoll? 基于select 的I/O 复用技术速度过慢,从代码上分析,最主要的两点是 每次调用select 函数是都需要向改函数传递对象信息 需要遍历所有文件描述符才能获取有变化的文件描述符 epoll 不需要以上两点操作 epoll 函数介绍 epoll_create /* Creates an epoll instance. Returns an fd for the new instance. The "size" parameter is a hint specifying the number of file descriptors to be associated with the new instance. The fd returned by epoll_create() should be closed with close(). */ extern int epoll_create (int __size) __THROW; epoll_ctl /* Manipulate an epoll instance "epfd". Returns 0 in case of success, -1 in case of error ( the "errno" variable will contain the specific error code )