socket在三种情况下返回可读:
1.如果对端TCP发送数据,那么该套接字变为可读,并且read返回一个大于0的值.
2.如果对端TCP发送一个FIN,那么该套接字变为可读,并且read返回0.
3.如果对端TCP发送一个RST,那么该套接字变为可读,并且read返回-1,而errno中含有确切的错误码.
shutdown和close的区别:
1.close把描述符的引用计数减1,仅在该计数变为0时才关闭套接字.使用shutdown可以不管引用计数就激发TCP的正常连接终止序列.
2.close终止读和写两个方向的数据传送,shutdown可以进行更细节的操作.
UDP的connect函数:
UDP调用connect函数可以检查立刻可知的错误(如显然不可到达的目的地).
可以断开原来的连接指定新的IP地址和端口号.
还能提高性能,UDP每次发送数据报都要经过连接发送断开这三个过程,但是如果每次只对一个目的地发送那么调用connect可以节省连接和断开的时间.
listen的backlog参数(被问到了再仔细看了一下)
首先我们要认识到内核为任意一个监听套接字维护两个队列:
(1)未完成连接队列,每个这样的SYN分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接字处于SYN_RCVD状态。
(2)已完成连接队列,每个已完成TCP三路握手过程的客户对应其中一项。这些套接字处于ESTABLISHED状态。
每当在未完成连接队列中创建一项时,来自监听套接字的参数就复制到即将建立的连接中。
每次accept都会把连接队列中的队头项返回给进程,如果为空就投入睡眠。曾经backlog规定为两个队列总和的最大值。后来给backlog增设了一个模糊因子,把他乘以1.5得到未处理队列最大长度,而backlog为已完成连接队列的最大数目。
sigpipe信号(还是面试问到,对信号不怎么了解当然是不会啦,所以又来学习了)
sigpipe产生的原因:client连接到server后突然崩溃,此时 server 并不知道 client 已经奔溃了,所以它会发送第一条消息给 client。但 client 已经退出了,所以 client 的 TCP 协议栈会发送一个 RST 给 server,server 在接收到 RST 之后,继续写入第二条消息。往一个已经收到 RST 的 socket 继续写入数据,将产生sigpipe信号,sigpipe信号默认处理方式是杀死程序,一般情况下我们忽略sigpipe信号。
RST产生:
1.连接到不存在的端口的请求会返回rst表示错误。具体可看状态转换图。
2.请求连接超时。同样会返回rst来表示错误。同样可看状态转换图。
3.某一端可能因为发生某些错误或者断电而异常关闭,此时对端不知道已经关闭了,当下次对端接受到消息时就会发rst。
4.在一个已关闭的socket接受到消息。
总结一下其实就是碰到异常情况就会发送rst。