Unix网络编程(卷1)—笔记

原创 2015年11月24日 20:52:40

1、unix域字节流套接字的 connect调用发现监听套接字的队列已满,调用立即返回ECONNREFUSED错误。TCP套接字(P86)的connect调用发现监听套接字队列已满,则忽略新到达的SYN分节,而TCP的连接端将数次发送SYN进行重试。P327
对于三次连接,需要详细阅读P84 listen函数。

2、unix域数据报,客户端必须显示的调用bind将客户端的地址(struct sockaddr_un,主要是设置路径)绑定到客户端的socket上,否则在服务器端调用recvfrom时收不到客户的地址结构,而无法给客户发送数据。
而UDP套接字,可以不用显示调用bind绑定客户端地址结构,会默认指定一个临时端口,以及发出时指定出口IP地址。P330

3、connect
对于UDP来说,并不使一个连接真正建立,而只是内核保存对端的IP地址和端口号。P196
非阻塞TCP套接字调用connect,会返回一个EINPROGRESS的错误(当客户与服务端在同一个主机的情况下,连接可以立即建立)。

4 、非阻塞的connect如何判断其连接成功 P354
1.调用getpeername代替getsockopt.如果调用getpeername失败,getpeername返回ENOTCONN,表示连接建立失败,我们必须以SO_ERROR调用getsockopt得到套接口描述符上的待处理错误;
2.调用read,读取长度为0字节的数据.如果read调用失败,则表示连接建立失败,而且read返回的errno指明了连接失败的原因.如果连接建立成功,read应该返回0;
3.再调用一次connect.它应该失败,如果错误errno是EISCONN,就表示套接口已经建立,而且第一次连接是成功的;否则,连接就是失败的;

5、被中断的connect
如果在一个阻塞式套接口上调用connect,在TCP的三路握手操作完成之前被中断了,比如说,被捕获的信号中断,将会发生什么呢?假定connect不会自动重启,它将返回EINTR.那么,这个时候,我们就不能再调用connect等待连接建立完成了,如果再次调用connect来等待连接建立完成的话,connect将会返回错误值EADDRINUSE.
在这种情况下,应该做的是调用select,就像在非阻塞式connect中所做的一样.然后,select在连接建立成功(使套接口描述符可写)或连接建立失败(使套接口描述符既可读又可写)时返回;

6、非阻塞的accept
本来不需要一个非阻塞的 accept, 因为如果我们使用select在某个监听套接字上等待一个外来的连接,当有一个已经完成的连接准备好被accept时,select将作为可读描述符返回该监听套接字,那么接下来的accept就不会被阻塞,因为select已经告诉了我们有连接准备好了。
但是有一种情况是,在select通告我们有连接准备好和在accept之间,收到了客户的RST终止连接,那么接下来的accept还是会被阻塞,等待其他新的连接准备好。 P362

7、带外数据
所有套接字选项会从监听套接字传承给已连接套接字,因此有些套接字选项的设置应该在已连接套接字之前设置,即在accept返回之前。
特点:
即使因为流量控制而停止发送数据了,TCP仍然发送带外数据的通知(即伴随紧急标志的URG标志已经设置),但是本身的带外数据不一定随同送出。
读操作总是停止在带外标记上。P514
当带外数据通知到达时,内核向属主进程发送一个SIGURG信号。
当带外数据通知已发送,接收进程准备读取带外数据时,若带外数据未在接收缓存中,那么recv返回EWOULDBLOCK。
每个TCP连接只能存储一个带外标记。P518

8、异步错误
P194 P526

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

《UNIX网络编程卷1》读书笔记--第一章 简介和TCP/IP

前言正如标题所说,第一章是对本书和TCP/IP的简介。简要介绍了网络通信的基本流程、简单socket客户端、服务端程序的编写,以及全书计算机运行的网络环境。 关注点 unp.h头文件 一个简单的时间获...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

《UNIX环境高级编程》笔记--套接字数据传输

套接字端点表示为文件描述符,只要建立连接,就可以使用read和write来通过套接字通信。在套接字描述符上采用read和 write是非常有意义的,因为可以传递套接字描述符到那些原来设计为处理本地文件...
  • TODD911
  • TODD911
  • 2014年02月28日 14:42
  • 1708

《UNIX网络编程 卷1》 笔记: 多线程—web客户程序

在非阻塞式connect—web客户程序一节中,我们使用非阻塞式connect(对于每个待读取的文件,向服务器发起非阻塞连接)和select(监听所有的套接字描述符)实现了一个web客户程序,本节我们...

《UNIX网络编程 卷1》 笔记: 原始套接字—ping程序

原始套接字提供普通的TCP和UDP套接字所不提供的以下3个能力:     1. 进程可以读写ICMPv4、IGMPv4、ICMPv6分组。     2. 进程可以读写内核不处理其协议字段的IPv4数据...

UNIX网络编程笔记(1)—传输层协议

UNIX网络编程,传输层协议简介

《UNIX网络编程 卷1》 笔记: 使用poll函数的单进程TCP回射服务器程序

本节我们使用poll函数来实现单进程TCP回射服务器。poll函数与select函数不同,它不使用描述符集,而是使用pollfd结构体数组,pollfd结构体如下: struct pollfd ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix网络编程(卷1)—笔记
举报原因:
原因补充:

(最多只允许输入30个字)