网络编程的一些小细节(不定时补充)

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值