网络IPC:套接字之建立连接

如果处理的是面向连接的网络服务(SOCK_STREAM或SOCK_SEQPACKET),在开始交换数据以前,需要在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接。客户端可以用connect建立一个连接。

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t len);
返回值:若成功则返回0,出错则返回-1

在connect中所指定的地址是想与之通信的服务器地址。如果sockfd没有绑定到一个地址,connect会给调用者绑定一个默认地址。

当连接一个服务器时,出于一些原因,连接可能失败。要连接的机器必须开启并且正在运行,服务器必须绑定到一个想与之连接的地址,并且在服务器的等待连接队列中应有足够的空间。因此,应用程序必须能够处理connect返回的错误,这些错误可能由一些瞬时变化条件引起。

实例

程序清单16-2显示了一种如何处理瞬时connect错误的方法。这在一个负载很重的服务器上很有可能发生。

#include "apue.h"
#include <sys/socket.h>#define MAXSLEEP 128int
connect_retry(int sockfd, const struct sockaddr *addr, socklen_t len)
{int nsec;/** Try to connect with exponential backoff.*/for(nsec = 1; nsec <= MAXSLEEP; nsec <<= 1){if(connect(sockfd, addr, alen) == 0){/** Connection accepted. */return(0);}/** Delay before trying again.*/if(nsec <= MAXSEELP/2)sleep(nsec);}return(-1);
}

这个函数使用了名为指数补偿(exponential backoff)的算法。如果调用connect失败,进程就休眠一小段时间后再尝试,每循环一次增加每次尝试的延迟,直到最大延迟为2分钟。

如果套接字描述符处于非阻塞模式下,那么在连接不能马上建立时,connect将会返回-1,并且将errno设为特殊的错误码EINPROGRESS。应用程序可以使用poll或select来判断文件描述符何时可写。如果可写,连接完成。

函数connect还可以用于无连接的网络服务(SOCK_DGRAM)。这看起来有点矛盾,实际上却是一个不错的选择。如果在SOCK_DGRAM套接字上调用connect,所有发送报文的目标地址设为connect调用中所指定的地址,这样每次传送报文时就不需要再提供地址。另外,仅能接收来自指定地址的报文。

服务器调用listen来宣告可以接受连接请求。

#include <sys/socket.h>
int listen(int sockfd, int backlog);
返回值:若成功则返回0,出错则返回-1

参数backlog提供了一个提示,用于表示该进程所要入队的连接请求数量。其实际值由系统决定,但上限由<sys/socket.h>中SOMAXCONN指定。

一旦队列满,系统会拒绝多余连接请求,所以backlog的值应该基于服务器期望负载和接受连接请求与启动服务的处理能力来选择。

一旦服务器调用了listen,套接字就能接收连接请求。使用函数accept获得连接请求并建立连接。

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);
返回值:若成功则返回文件(套接字)描述符,出错则返回-1

函数accept所返回的文件描述符是套接字描述符,该描述符连接到调用connect的客户端。这个新的套接字描述符和原始套接字(sockfd)具有相同的套接字类型和地址族。传给accept的原始套接字没有关联到这个连接,而是继续保持可用状态并接受其他连接请求。

如果不关心客户端标识,可以将参数addr和len设为NULL;否则,在调用accept之前,应将参数addr设为足够大的缓冲区来存放地址,并且将len设为指向代表这个缓冲区大小的整数的指针。返回时,accept会在缓冲区填充客户端的地址并且更新指针len所指向的整数为该地址的大小。

如果没有连接请求等待处理,accept会阻塞直到一个请求到来。如果sockfd处于非阻塞模式,accept会返回-1并将errno设置为EAGAIN或EWOULDBLOCK。

如果服务器调用accept并且当前没有连接请求,服务器会阻塞直到一个请求到来。另外,服务器可以使用poll或select来等待一个请求的到来。在这种情况下,一个带等待处理的连接请求套接字会以可读的方式出现。

实例

程序清单16-3显示了一个服务器进程用以分配和初始化套接字的函数。

程序清单16-3 服务器初始化套接字端点 

#include "apue.h"
#include <errno.h>
#include <sys/socket.h>int
initserver(int type, const struct sockaddr *addr, socklen_t alen, int qlen)
{int fd;int err = 0;if((fd = socket(addr->sa_family, type, 0)) < 0)return(-1);if(bind(fd, addr, alen) < 0){err = errno;goto errout;}if(type == SOCK_STREAM || type == SOCK_SEQPACKET){if(listen(fd, qlen) < 0){err = errno;goto errout;    }}return(fd);errout:close(fd);errno = err;return(-1);
}

 

本篇博文内容摘自《UNIX环境高级编程》(第2版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

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

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

相关文章

Linux I2C 驱动实验

目录Linux I2C 驱动框架简介I2C 总线驱动I2C 设备驱动I2C 设备和驱动匹配过程I.MX6U 的I2C 适配器驱动分析I2C 设备驱动编写流程I2C 设备信息描述I2C 设备数据收发处理流程硬件原理图分析实验程序编写修改设备树AP3216C 驱动编写编写测试APP运行测试编译驱动程序和测试APP运行测…

Min_25 筛小结

Min_25 筛这个东西&#xff0c;完全理解花了我很长的时间&#xff0c;所以写点东西来记录一些自己的理解。 它能做什么 对于某个数论函数 \(f\)&#xff0c;如果满足以下几个条件&#xff0c;那么它就可以用 Min_25 筛来快速求出这个函数的前缀和。 它是一个积性函数对于一个质…

【转】logback 常用配置详解(序)logback 简介

原创文章&#xff0c;转载请指明出处&#xff1a;http://aub.iteye.com/blog/1101222&#xff0c; 尊重他人即尊重自己 详细整理了logback常用配置&#xff0c; 不是官网手册的翻译版&#xff0c;而是使用总结&#xff0c;旨在更快更透彻的理解其配置 logback 常用配置详解&…

Linux curl 命令

curl is a tool to transfer data from or to a server, using one of the supported protocols ( http &#xff0c;https &#xff0c;ftp &#xff0c;telnet &#xff0c;...... ) [rootlocalhost ~]$ curl http://www.baidu.com/ # 获取指定页面&#xf…

vmware克隆Centos6.4虚拟机网卡无法启动问题

快速处理办法&#xff1a;cat /etc/sysconfig/network-scripts/ifcfg-eth0sed -i /UUID/d /etc/sysconfig/network-scripts/ifcfg-eth0sed -i /HWADDR/d /etc/sysconfig/network-scripts/ifcfg-eth0>/etc/udev/rules.d/70-persistent-net.rules rebootvmware克隆Centos6.4虚…

NXP(I.MX6uLL)DDR3实验——DDR3重要时间参数、时钟配置与原理图简析

目录DDR3 内存时间参数传输速率tRCD 参数CL 参数AL 参数tRC 参数tRAS 参数I.MX6U MMDC内存控制器简介MMDC内存控制器简介MMDC内存控制器信号引脚MMDC内存控制器时钟源ALPHA开发板核心板DDR3L原理图DDR3 内存时间参数 大家在购买DDR3 内存的时候通常会重点观察几个常用的时间参…

[elk]elasticsearch dsl语句

例子1 统计1&#xff0c;有唱歌兴趣的 2&#xff0c;按年龄分组 3&#xff0c;求每组平均年龄 4,按平均年龄降序排序 sql转为dsl例子 # 每种型号车的颜色数 > 1的 SELECT model,COUNT(DISTINCT color) color_count FROM cars GROUP BY model HAVING color_count > 1 ORDE…

编写atoi库函数

看到很多面试书和博客都提到编写atoi函数&#xff0c;在很多面试中面试官都会要求应聘者当场写出atoi函数的实现代码&#xff0c;但基本很少人能写的完全正确&#xff0c;倒不是这道题有多么高深的算法&#xff0c;有多么复杂的数据结构&#xff0c;只因为这道题要考虑的情况比…

NXP(I.MX6uLL)DDR3实验——DDR3初始化、校准、超频测试

DDR3L 初始化与测试ddr_stress_tester简介(DDR压力测试工具)DDR3L驱动配置DDR3L校准DDR3L超频测试DDR3L驱动总结ddr_stress_tester简介(DDR压力测试工具) NXP 提供了一个非常好用的DDR 初始化工具&#xff0c;叫做ddr_stress_tester。此工具已经放到了开发板光盘中&#xff0c…

Git 初识

Git是什么&#xff1f; Git(读音为/gɪt/。)是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一…

RGBLCD显示实验————复习到这

目录LCD 和eLCDIF 简介LCD 简介eLCDIF 接口硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载LCD 液晶屏是常用到的外设&#xff0c;通过LCD 可以显示绚丽的图形、界面等&#xff0c;提高人机交互的效率。I.MX6U 提供了一个eLCDIF 接口用于连接RGB 接口的液…

std::shared_ptr

在std::shared_ptr被引入之前&#xff0c;C标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已。std::auto_ptr的作用非常有限&#xff0c;因为它存在被管理资源的所有权转移问题。这导致多个std::auto_ptr类型的局部变量不能共享同一个资源&#xff0c;这个问题是…

unity 里调试native code

因项目需要&#xff0c;需要调试dll工程代码。 把生成的debug dll和pdb拷贝进unity的plugins工程&#xff0c;遇到 断点无法进入&#xff0c;修改下调试信息格式&#xff0c;OK。 转载于:https://www.cnblogs.com/marcher/p/10191521.html

将自己写的windows服务加入到windows集群中

最近发现windows集群能进行很多自定义&#xff0c;比如在集群中加入自己编写的服务。 能自定义的可不少&#xff0c;截个图&#xff1a; 本次演示中&#xff0c;只想用“通用服务”这个类型。 先列下步骤编写一个记录时间的Windows服务&#xff0c;这个服务会每隔1秒钟写入本地…

RTC实时时钟实验(低功耗、纽扣电池供电)

目录I.MX6U RTC 简介硬件原理分析实验程序编写修改文件MCIMX6Y2.h编写实验程序编译下载验证编写Makefile 和链接脚本编译下载实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。因此在需要记录时间的场合就需要实时时钟&#xff0c;可…

Python(21)_input用户交互

name input("请输入你的名字&#xff1a;") age input("请输入你的年龄&#xff1a;") print("我的名字是&#xff1a;"name" 年龄是&#xff1a;"age) #print(name) #print(age) 这是在本地调试的结果。因为程序是在远程服务器上执…

多点电容触摸屏实验

目录多点电容触摸简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载随着智能手机的发展&#xff0c;电容触摸屏也得到了飞速的发展。相比电阻触摸屏&#xff0c;电容触摸屏有很多的优势&#xff0c;比如支持多点触控、不需要按压&#xff0c;只需要轻轻…

博客园自动添加版权说明,自动添加文章链接

功能&#xff1a; 1.给每一篇文章开头加上版权说明&#xff1b; 2.自动获取当前文章地址&#xff1b; 3.做了装饰。 将以下代码放在页首Html代码内即可&#xff1a; <script type"text/javascript"> var setMyBlog {setCopyright: function() {//设置版权信息…

如何添加地图控件到Windows Phone 8的页面中

原文 如何添加地图控件到Windows Phone 8的页面中 本主题介绍了各种方法来添加一个地图控件到Windows Phone 8的项目。该地图控件在Windows Phone的SDK 8.0的库的一部分。因为地图的控制是不是在内存中的核心控制&#xff0c;它必须被正确引用&#xff0c;然后才能使用它。您还…

LCD背光调节实验

目录LCD 背光调节简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载不管是使用显示器还是手机&#xff0c;其屏幕背光都是可以调节的&#xff0c;通过调节背光就可以控制屏幕的亮度。在户外阳光强烈的时候可以通过调高背光来看清屏幕&#xff0c;在光线…