服务器编程

acl 服务器编程框架与 Postfix 的服务器架构的功能对比

拜拜、爱过 提交于 2019-12-06 16:41:08
acl 中服务器框架模块是一个非常重要的模块,使用该模块技术人员可以快速地写出稳定、安全、高效的网络服务应用,该模块主要来源于著名的邮件服务器程序 (Postfix) 中的 master 模块,为了便于开发者使用,本人又增加了许多有益的功能模块。在 acl 的文章分类 ” acl开发--服务器篇 “ 和 ” acl_cpp开发--服务器开发 “ 中有关 master 服务器框架的流程图及实例讲解,本文将只对比 acl 里的 master 服务器框架(简称 acl_master) 和 Postfix 中的 master 服务器框架的不同点,以便于开发人员根据不同的使用场景选择不同的服务模块。 功能点 Postfix master acl_master 半驻留服务模式 支持 支持 安全控制 严格的用户权限控制 严格的用户权限控制 配置方式 所有服务配置在同一个配置文件中 一个服务一个配置文件 进程池模式 支持 支持 触发器模式 支持 支持 非阻塞模式 功能一般 功能强大 线程池模式 不支持 支持 在线升级 支持 支持 预启动 不支持 支持 最小进程数控制 不支持 支持 最大进程数控制 支持 支持 监控子进程报警机制 不支持 支持 开发过程调试功能 不太方便 方便(很容易使用 valgrind 检查) 客户端连接访问控制 应用自己保证 框架自动支持 单一进程监听多个地址 受限 支持

Socket通讯编程

大憨熊 提交于 2019-12-06 13:07:20
此随笔是站在巨人的肩膀上总结的! 1)socket的概念   Socket也称‘套接字’,用于描述IP地址和端口,是一个通讯链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket。建立网络通信连接至少是要一对端口号(Socket)。   Socket本质是编程接口,是对TCP/IP的封装。Socket编程接口——程序员进行网络开发所用接口。比喻一番:如果说HTTP是轿车,提供了封装或者显示数据的具体形式;那么Socket是发动机,提供了网络通信的能力。   那么Socket跟TCP/IP协议之间是怎么个关系呢?先来看看下面那张图:                       图一 2)Socket起了什么作用?     Socket是应用层与 TCP/IP协议族(包括运输层、网络层、链路层)通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。 3)Socket编程的工作原理   举个生活中的场景: 你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束

TCP客户端服务器编程模型

笑着哭i 提交于 2019-12-06 07:12:37
1.客户端调用序列 客户端编程序列如下: 调用socket函数创建套接字 调用connect连接服务器端 调用I/O函数(read/write)与服务器端通讯 调用close关闭套接字 2.服务器端调用序列 服务端的编程序列如下: 调用socket函数创建套接字 调用bind绑定本地地址和端口 调用listen启动监听 调用accept从已连接队列中提取客户端连接 调用I/O函数(read/write)与客户端通讯 调用close函数关闭套接字 3.常用函数 3.1.套接字与地址绑定函数 (1)绑定地址 #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t len); 返回:成功返回0,出错返回-1 特殊bind地址介绍 一个主机可以有多个网络接口和多个IP地址,如果我们只关心某个地址的连接请求,我们可以指定一个具体的本地IP地址,如果要响应所有接口上的连接请求就要使用一个特殊的地址INADDR_ANY #define INADDR_ANY (uint32_t)0x00000000 监听所有服务器上IP得到的连接请求 struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr

Socket 编程

末鹿安然 提交于 2019-12-06 05:46:10
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。 传输层 实现 端到端 的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是 主机 ,不是主机的 IP地址 ,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。 根据RFC793的定义: 端 口号 拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。 总之,套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。 套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中

[go]socket编程

試著忘記壹切 提交于 2019-12-06 04:34:44
socket特性 总是成对出现 是全双工的(同时支持收发)(两个channel绑在一起) 应用程序 - cs模式(客户端开发) - bs模式(web开发) net包api基础 都是客户端主动发数据(client request) 一共有3个soket。用于通信的有2个。另一个用于监听ip端口 // 服务端 import ( "net" ) listener, err := net.Listen("tcp", "127.0.0.1:8000") //生成监听socket defer listener.Close() conn, err := listener.Accept() //[**阻塞] 生成读写socket defer conn.Close() buf := make([]byte, 4096) n, err := conn.Read(buf) //[**阻塞] //读客户端数据(client request) conn.Write(buf[:n]) //写数据给客户端 //客户端 conn, err := net.Dial("tcp", "127.0.0.1:8000") defer conn.Close() conn.Write([]byte("Are you Ready?")) //写数据 buf := make([]byte, 4096) //读数据 n, err :

PHP并发IO编程之路

Deadly 提交于 2019-12-04 03:56:53
并发 IO 问 题一直是后端编程中的技术挑战,从最早的同步阻塞Fork进程,到多进程/多线程,到现在的异步IO、协程。PHP程序员因为有强大的LAMP框架,对底 层方面的知识知之甚少,本文目的就是详细介绍PHP进行并发IO编程的各种尝试,最后再介绍Swoole的使用,深入浅出全面理解并发IO问题。 多进程 / 多线程同步阻塞 最早的服务器端程序都是通过多进程、多线程来解决并发 IO 的问题。进程模型出现的最早,从 Unix 系统诞生就开始有了进程的概念。 最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步阻塞地与客户端连接进行交互,收发处理数据。 多线程模式出现要晚一些,线程与进程相比更轻量,而且线程之间是共享内存堆栈 的,所以不同的线程之间交互非常容易实现。比如聊天室这样的程序,客户端连接之间可以交互,比聊天室中的玩家可以任意的其他人发消息。用多线程模式实现非 常简单,线程中可以直接读写某一个客户端连接。而多进程模式就要用到管道、消息队列、共享内存实现数据交互,统称进程间通信( IPC )复杂的技术才能实现。 代码实例: 多进程 / 线程模型的流程是 创建一个 socket ,绑定服务器端口( bind ),监听端口( listen ),在 PHP 中用 stream_socket_server 一个函数就能完成上面 3 个步骤

PHP并发IO编程之路

非 Y 不嫁゛ 提交于 2019-12-04 03:56:42
并发 IO 问 题一直是服务器端编程中的技术难题,从最早的同步阻塞直接Fork进程,到Worker进程池/线程池,到现在的异步IO、协程。PHP程序员因为有强大 的LAMP框架,对这类底层方面的知识知之甚少,本文目的就是详细介绍PHP进行并发IO编程的各种尝试,最后再介绍Swoole的使用,深入浅出全面解 析并发IO问题。 多进程 / 多线程同步阻塞 最早的服务器端程序都是通过多进程、多线程来解决并发 IO 的问题。进程模型出现的最早,从 Unix 系统诞生就开始有了进程的概念。 最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步阻塞地与客户端连接进行交互,收发处理数据。 多线程模式出现要晚一些,线程与进程相比更轻量,而且线程之间是共享内存堆栈 的,所以不同的线程之间交互非常容易实现。比如聊天室这样的程序,客户端连接之间可以交互,比聊天室中的玩家可以任意的其他人发消息。用多线程模式实现非 常简单,线程中可以直接向某一个客户端连接发送数据。而多进程模式就要用到管道、消息队列、共享内存,统称进程间通信( IPC )复杂的技术才能实现。 代码实例: 多进程 / 线程模型的流程是 创建一个 socket ,绑定服务器端口( bind ),监听端口( listen ),在 PHP 中用 stream_socket_server 一个函数就能完成上面

Python CGI编程

白昼怎懂夜的黑 提交于 2019-12-03 22:58:41
Python CGI编程 什么是 CGI CGI 目前由 NCSA 维护,NCSA 定义 CGI 如下: CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP 服务器,提供同客户端 HTML 页面的接口。 网页浏览 为了更好的了解 CGI 是如何工作的,我们可以从在网页上点击一个链接或 URL 的流程: 1、使用你的浏览器访问 URL 并连接到 HTTP web 服务器。 2、Web 服务器接收到请求信息后会解析 URL,并查找访问的文件在服务器上是否存在,如果存在返回文件的内容,否则返回错误信息。 3、浏览器从服务器上接收信息,并显示接收的文件或者错误信息。 CGI 程序可以是 Python 脚本,PERL 脚本,SHELL 脚本,C 或者 C++ 程序等。 CGI架构图 Web 服务器支持及配置 在你进行 CGI 编程前,确保您的 Web 服务器支持 CGI 及已经配置了 CGI 的处理程序。 Apache 支持 CGI 配置: 设置好CGI目录: 所有的HTTP服务器执行 CGI 程序都保存在一https://www.xuanhe.net/个预先配置的目录。这个目录被称为 CGI 目录,并按照惯例,它被命名为 /var/www/cgi-bin 目录。 CGI 文件的扩展名为 .cgi ,python 也可以使用

【linux下c语言服务器开发系列5】功能齐全的聊天室 sever [IO复用+多进程+信号处...

*爱你&永不变心* 提交于 2019-12-03 01:03:41
上个博客的最后,说要写一个功能齐全一些服务器,所以,这边博客主要对这个服务器进行一个简单的介绍。这个服务器,是一个聊天室服务器。 当客户端连接到服务器后,就可以收到所有其他客户端发送给服务器的内容。主要实现原理如下: 1.IO复用: 利用epoll函数,对多个套接字进行监听,包括:listenfd,标准输入套接字,与子进程通讯的套接字还有信号处理的套接字。 listenfd:这个套接字主要是服务器端用来监听是否有新的客户端的连接的。一旦有连接,则视为新的客户到来,然后,准备连接,分配用户内存,对应各种信息,连接成功后,fork一个子进程进行对这个连接进行一对一的处理。这里的处理,主要是对各种套接字进行监听,并进行相应的处理,下文的多进程部分会有。 标准输入套接字:为的是在服务器端也能输入一些信息,并让这个服务器根据输入的信息进行反应。不过,我这里的反应主要是让服务器原样输出。 与子进程通讯的套接字:因为没个客户,都是用一个子进程在单独的处理,各个子进程之间的通信,首先需要通过父进程,然后再进行广播,从而实现子进程与其他所有子进程之间的通信。这里,子进程与父进程之间的通信,是靠管道完成的。但是,传统的管道是pipe()函数创建的,只能单工的通信,我这里为了双工的通信,使用的是socketpair()创建的管道,管道的两端都可以进行读写操作。如果子进程有数据写给父进程

【linux下c语言服务器开发系列】 开篇(socket的基本操作)

天涯浪子 提交于 2019-12-03 01:03:31
对于linux下c语言的编程,尤其是网络编程这部分,还是有一些莫名的爱好的。学习了一些东西,如果不加以总结和实际操作,往往容易忘了。所以,在此写个系列的博客,记录一下,从零开始写linux下的服务器编程。希望看到这篇日志的同学,多提意见,共同学习。 对于网络编程,主要是对socket和IO进行操作。为了实现高效通讯,需要一些策略,后面会介绍到。作为开篇,主要是对socket的基础操作的讲解。 socket本质上就是一个int的数字,文件描述符,用于标识主机间端到端的通讯。两端的主机,通过对该socket进行读写,完成双方的通讯。 socket需要新建(socket())、绑定(bind()),监听(listen),接收连接(accept()),以及读写(read() write(),还有别的IO函数)等。绑定,是将已经新建好的socket与本地的地址进行一个联系。地址( struct sockaddr_in )的设定往往根据需要的具体情况,包括协议、端口、IP地址等。监听是告诉客户端,服务器这边已经准备好了,等待为其服务啦。接受连接是在客户端请求连接时,双方建立连接的通道,为通讯做好准备。接下来,就是数据交换(读和写)。关于读写的函数,比较多,read()\write(), recv()\send()、recvfrom\sendto(),recvmsg()\sendmsg()等