一个典型的服务器进程打开一个监听端口,并且监听这个端口等待任意客户端进程的链接,然后接受这个客户端的链接,然后使用一种网络协议进行通信。虽然网络协议依赖于你的应用程序,但是以一个基本的服务器结构的代码大体上相同。

一、APR_DECLARE(apr_status_t) apr_sockaddr_info_get(apr_sockaddr_t **sa, const char *hostname, apr_int32_t family, apr_port_t port, apr_int32_t flags, apr_pool_t *p);

首先,我们需要创建一个socket地址对象,apr_sockaddr_t。在传统的socket编程中,socket地址结构会引起一些混乱。形成鲜明对比,APR的socket地址结构非常简单。在不同的平台和IPv4/IPv6两个协议栈中它能够隐藏一些混乱。我们可以通过apr_sockaddr_info_get()创建这个对象

第一个参数是结构参数(result argument),第二个参数是主机名或者IP地址。第三个参数是地址类型(address family),它通常是APR_INET,如果你使用的是IPv6,请将他设定为APR_INET6,第四个参数是端口号。服务器端编程应该指定一个监听的端口号,例如如果你创建的是一个Web服务器,你应该指定这号码是80。正如你所预料的客户端编程指定的是远程服务器的的端口号,所以如果你正在编写以一个Web浏览器,你也该指定这个号码为80。注意你可以设置端口号为0,如果这样系统则选择一个可用的端口,第五个参数是一个标志位,大多数情况下为0,最后一个参数是所使用的内存池。

当你在进行客户端编程时候,客户端程序通常指定是服务器的主机名或者IP地址,相比客户端编程,服务器编程应该指定他为本地地址,并且通过apr_socket_bind()绑定Socket地址对象。

什么值可以作为本地地址?一种选择就是使用真实的地址或主机名称

第二种选择是选用环路地址(loopback address)或者“localhost”。使用这些都是可行的

还有一种选择是将本地址设置为NULL或者是APR_ANYADDR(="0.0.0.0")。这样设置暗含表示将全部的网络接口绑定到这socket,因此在这样情况下,服务器通过设置真实的地址或者环路地址任何客户端都可以链接他。从内部实现角度来看NULL要比APR_ANYADDR更好,因此我们通常选择NUL作为apr_sockaddr_info_get()的第二个参数。这里会有一种异常情况,当服务具有多个IP地址时,而你不希望全部的IP地址对远程可用,你就不能指定为NULL,你必须为这个监听socket指定一个实际的IP地址。

二、APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new_sock, int family, int type, int protocol, apr_pool_t *cont);

接下来,创建一个socket对象apr_socket_t。在传统的soket编程中,socket类型是一个整形,并且扮演这一个文件描述符的角色。apr_socket_t是一个不透明的类型它依赖于具体的操作系统,我们可以使用apr_socket_create()创建一个socket对象

第一个参数是一个结果参数(result argument)第二个参数是地址类型,他和apr_sockaddr_info_get()中的第三个参数一样,稍后我们将说明socket地址对象和socket对象的关系。如果他们使用不一样的地址类型,apr_socket_create将会失败。第三个和第四个参数是socket类型和协议类型。总而言之,他们一共有两种组合,一种是SOCK_STREAM作为socket类型,APR_PROTO_TCP作为协议类型,另一种是SOCK_DGRAM作为socket类型,APR_PROTO_UDP作为协议类型。最后一个参数是内存池。

apr_sockaddr_t *sa;
apr_socket_t *s;

apr_sockaddr_info_get(&sa, NULL, APR_INET, DEF_LISTEN_PORT, 0, mp);
apr_socket_create(&s, sa->family, SOCK_STREAM, mp);
apr_socket_bind(s, sa);
apr_socket_listen(s, DEF_SOCKET_BACKLOG);

你能发两个新的API,apr_socket_bind()和apr_socket_listen()。通过调用apr_socket_bind(),我们能够在socket对象(apr_socket_t)和socket地址对象(apr_sockaddr_t)间建立对应关系。我们称之为讲一个地址绑定到一个socket。然后,通过调用apr_socket_listen()我们将socket的状态改成监听状态。也就是说我们允许这个socket接受一个远程客户端的链接。apr_socket_listen()的第二个参数是内部队列的长度,这个队列是客户端的等待队列。这个队列由内核负责,直到应用程序接受为止。这个长度出于历史原因被称之为backlog。如果你不能确信一个合适的值,我建议你使用'SOMAXCONN',这是系统默认的最大值。

三、apr_socket_t *ns;/* accepted socket */
apr_socket_accept(&ns, s, mp);

apr_socket_accept()的第二个参数是我们之前创建的监听socket对象。这里我们还得到另一个socket对象,名为’ns’的接收socket。从socket对象创建方面看,apr_socket_accept()和apr_socket_create()非常相似。也就是说apr_socket_accept()也创建了一个新的socket对象,他的第一个参数是一个结果参数。注意新创建出来的socket对象和通过第二个参数传入apr_socket_accept()的监听socket对像完全不一样,在apr_socket_accept()返回后,监听socket仍然还是监听socket。也就我们可以在有客户端链接服务器时候继续调用apr_socket_accept(),我们将从apr_socket_accept()得到另外一个socket对象。在调用apr_socket_accept()后,我需要处理两个独立的socket,具体来说我们有一个socket继续保持静听状态,而我们使用已接受的socket通过指定网络协议和客户端进行交互。在server-sample.c中,我们发送了一个简单的HTTP请求并且得到相应的应答信息

四、APR_DECLARE(apr_status_t) apr_socket_send(apr_socket_t *sock, const char *buf, apr_size_t *len);

APR_DECLARE(apr_status_t) apr_socket_recv(apr_socket_t *sock, char *buf, apr_size_t *len);

APR-服务器端编程相关推荐

  1. 浅谈网络游戏的设计——服务器端编程 (3)

    关键词: 网络游戏 构思 策划 创意 竞争机制 竞争系统 本系列文章始终以浅谈二字开头,所以内容简单,不够深入,希望大家谅解. 但是,正如人类的学习过程一样,是一个由浅入深的过程.市面上很多昂贵的图书 ...

  2. 文件服务器和客户模式有什么区别,客户端和服务器端编程有什么区别?

    皈依舞 我将尝试以简单的方式解释它.客户端是用户在浏览器上看到/看到的代码.客户端编程包括HTML(HTML,HTML5,DHTML),CSS(CSS,CSS3)和JavaScript(JavaScr ...

  3. 文件下载--服务器端编程操作

    创建DownloadServlet// 1.得到要下载 的文件名称String filename = request.getParameter("filename");//2.判断 ...

  4. 服务器端编程心得(七)——开源一款即时通讯软件的源码

    服务器端编程心得(七)--开源一款即时通讯软件的源码 2017年04月06日 22:57:01 analogous_love 阅读数:30222更多 所属专栏: 高性能服务器编程实现细节详解 版权声明 ...

  5. WEB客户端编程与服务器端编程

    WEB客户端编程与服务器端编程 一.HTTP协议事务处理过程: (1)建立连接.HTTP协议是一种无状态协议,对于每一次请求都要求建立一个新的连接. (2)发送请求.客户向服务器发送一个请求,请求某种 ...

  6. 客户端编程和服务器端编程有什么区别?

    本文翻译自:What is the difference between client-side and server-side programming? I have this code: 我有以下 ...

  7. 推荐《Linux 多线程服务器端编程》

    赖勇浩(http://laiyonghao.com) 最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书.我推荐了<Linux 多线程服务器端编程--使用 mu ...

  8. 浅谈网络游戏的设计——服务器端编程

    浅谈网络游戏的设计--服务器端编程 本游戏服务器端操作系统采用UNIX,因为UNIX是标准的服务器操作系统,可保证网络游戏的稳定性.因此,以下所有的编程都将针对UNIX进行. 服务器端的整体构架如下: ...

  9. Java网络编程入门(二)之客户端与服务器端编程步骤详解

    1.2 网络编程技术 前面介绍了网络编程的相关基础知识,初步建立了网络编程的概念,但是实际学习网络编程还必须使用某种程序设计语言进行代码实现,下面就介绍一下网络编程的代码实现. 1.2.1 网络编程步 ...

  10. 服务器端编程心得(三)—— 一个服务器程序的架构介绍

    本文将介绍我曾经做过的一个项目的服务器架构和服务器编程的一些重要细节. 一.程序运行环境 操作系统:centos 7.0 编译器:gcc/g++ 4.8.3     cmake 2.8.11 mysq ...

最新文章

  1. 用gcc编译实现对Linux系统cpu占用
  2. Xamarin.FormsShell基础教程(3)Shell项目构成
  3. EasyDarwin开源社区 短视频拍摄项目Github地址
  4. python入门有基础-Python基础知识入门,这三个原则是你要知道的,还有教程
  5. k-means聚类分割
  6. 获取this_带你彻底弄清JavaScript的关键字this
  7. java word 加密_如何通过Java实现加密、解密Word文档
  8. c++ pat 乙级 --1001 害死人不偿命的(3n+1)猜想
  9. [深圳/广州]微软SQL技术沙龙分享会(MVP)
  10. 哟,2020年了!试着用vue做一个自己的小程序吧~~
  11. 浙大 PAT 甲级1009
  12. 基于Redis的分布式锁的简单实现
  13. Qt使用MSVC编译器关闭“C4100:未引用的形参”警告的方法
  14. 微服务模式下API测试
  15. pyspark的用法
  16. eval('{kkk:{}}')出错,eval('{}')与eval('var ss = {kkk:{}}')正常
  17. Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]
  18. VBA批量编辑word图片尺寸
  19. 《东周列国志》第五十八回 说秦伯魏相迎医 报魏錡养叔献艺
  20. 树莓派hdmi输出没声音_如何解决外接Hdmi没有声音的问题

热门文章

  1. matlab 新建prj,操作方法:为 shapefile 创建投影元数据 (.prj) 文件
  2. vim 设置文件类型_如何手动设置Vim的文件类型?
  3. codeforces1299C Water Balance
  4. PPT太大怎么进行压缩
  5. 关于阻抗设计的建议-来至深南电路板厂的心水总结
  6. apkg格式怎么打开_jpg怎么转换成pdf?再不学就晚了!
  7. 市场对计算机专业的需求是怎么样的,计算机专业的行业需求分析
  8. 计算机与代数---如何计算log---方法推理[1]
  9. Excel单元格设置选择项
  10. 使用MongoDB Compass将JSON数据文件导入MongDB