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

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

你可能感兴趣的:(unix,网络编程)