《UNIX网络编程 卷1:套接字联网API(第3版)》——8.12 dg_cli函数(修订版)

简介: 所做的修改是调用connect,并以read和write调用代替sendto和recvfrom调用。该函数不查看传递给connect的套接字地址结构的内容,因此它仍然是协议无关的。图8-7中的客户程序main函数保持不变。

本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.12节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看

8.12 dg_cli函数(修订版)

现在我们回到图8-8中的dg_cli函数,把它重写成调用connect。图8-17所示为新的函数。
screenshot

所做的修改是调用connect,并以read和write调用代替sendto和recvfrom调用。该函数不查看传递给connect的套接字地址结构的内容,因此它仍然是协议无关的。图8-7中的客户程序main函数保持不变。

在主机macosx上运行该程序,并指定主机freebsd4的IP地址(它没有在端口9877上运行相应的服务器程序),我们得到如下输出:

macosx % udpcli04 172.24.37.94
hello, world
read error: Connection refused

我们首先注意到,当启动客户进程时我们并没有收到这个错误。该错误只是在我们发送第一个数据报给服务器之后才发生。正是发送该数据报引发了来自服务器主机的ICMP错误。然而当一个TCP客户进程调用connect,指定一个不在运行服务器进程的服务器主机时,connect将返回同样的错误,因为调用connect会造成TCP三路握手,而其中第一个分节导致服务器TCP返送RST(4.3节)。

图8-18给出了tcpdump的输出。

screenshot

我们还从图A-15中看到,该ICMP错误由内核映射成ECONNREFUSED错误,对应于由err_sys函数输出的消息串:“Connection refused”(连接被拒绝)。

不幸的是,并非所有内核都能像本节的示例那样把ICMP消息返送给已连接的UDP套接字。一般来说,源自Berkeley的内核返回这种错误,而System V内核则不。举例来说,如果我们在一个Solaris 2.4主机上运行同一个客户程序,并connect到没有运行服务器的一个主机上,我们就可以用tcpdump观察并验证服务器主机返回了ICMP端口不可达错误,但是客户的read调用永不返回。这个缺陷在Solaris 2.5中已修复。UnixWare不返回这种错误,而AIX、Digital Unix、HP-UX和Linux都返回这种错误。

相关文章
|
1月前
|
缓存 JavaScript 算法
活用 Composition API 核心函数,打造卓越应用(下)
活用 Composition API 核心函数,打造卓越应用(下)
|
1月前
|
存储 JavaScript API
活用 Composition API 核心函数,打造卓越应用(上)
活用 Composition API 核心函数,打造卓越应用(上)
|
2月前
|
机器学习/深度学习 测试技术 Python
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
136 0
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
|
1月前
|
人工智能 关系型数据库 Serverless
Serverless 应用引擎常见问题之API生成的函数镜像改为自定义的镜像如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
39 3
|
1月前
|
网络协议 Linux API
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
74 0
|
28天前
|
存储 Unix Linux
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
14 0
|
30天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
92 3
|
1月前
|
网络协议 Linux C++
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
25 0
|
1月前
|
网络协议 安全 网络安全
Qt 套接字类(QTcpSocket和QUdpSocket)解密:迈向 Qt 网络编程之巅
Qt 套接字类(QTcpSocket和QUdpSocket)解密:迈向 Qt 网络编程之巅
100 0
|
1月前
|
网络协议 Java API
网络编程套接字(2)
网络编程套接字(2)