.1.关于tcp连接异常断开
(1)服务器端异常断开,setsockopt函数设置SO_REUSE,保证可以再次重启服务端
(2)客户端异常断开,要采用心跳包(保活)机制。
<1>setsockopt函数,SO_KEEPALIVE, 发送探测包(该进程所有的socket都会有这个设置,不灵活)
<2>select函数管理文件,延时等待,超时断开
<3>应用层发送心跳包,可以设置定时发几次 (推荐使用这种,易于控制)
一般连接断开后recv就会返回0,
而keepalive定时器定时完成后,recv返回-1, 同时errno对应错误4(未验证成功)。
意义:
如果不去处理异常连接,会占用资源,比如,大量连接出于close_wait状态,无法正常断开,释放资源,达到监听上限,这样就无法处理新的连接请求。
2.关于bind函数
1.服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接,一般一个服
务器程序里都有,servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是针对IP4,IP6代码不太一样
这样一句话,意思就是:我不指定客户端的IP,随便连,来者不拒!
2.bind时候没有指定哪一项(置为0),内核会帮你选择。客户端进程bind端口: 由进程选择一个端口去连服务器,(如果默认情况下,调用bind函数时,内核指定的端口是同一个,那么调用多个调用了bind()的client程序,会出现端口被占用的错误)注意这里的端口是客户端的端口。如果不分配就表示交给内核去选择一个可用端口。
3.服务器和客户端都可以bind,bind并不是服务器的专利(1)需要在建连前就知道端口的话,需要 bind (2)需要通过指定的端口来通讯的话,需要 bind 。