您的位置:首页 > 理论基础 > 计算机网络

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

2015-11-24 20:52 435 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: