多进程通信

多进程并发需要注意的问题:

对于大型Socket项目中,客户端异常终止,服务器用于处理客户端的自己成还处于read阻塞,如何处理?

1、调用setsockopt()函数,让内核自己处理:

int setsockopt(int sockfd, int level, int optname, void * optval, socklen_t * optlen);//该函数能够设置TCP链接的存活属性
getsockopt(int sockfd, int level, int optname, void * optval, socklen_t optlen);

当设置连接的TCP存活属性之后,如果长时间(2小时左右(总之很长))客户端都没有向服务器发送数据请求(通信数据),那么服务器就会向客户端发送一个确认客户端是否异常断开链接的请求包,如果线路通常,客户端TCP/IP内核栈会自动发送一个携带RST复位信息的包,当服务器接收到RST复位信息后就知道客户端是异常结束的(如:Ctrl+C等),那么服务器就会自动断开该条链接。如果客户端是因为网络等问题结束的,服务器发送的包,客户端可能不会收到,也不会恢复服务器,那么服务器就重新发送,发送多次(十多次)以后,服务器依然没有收到回复,服务器就认为是客户端网络等问题导致的线路不通畅,就会关闭该条链接。服务器断开该条链接后,服务器端的阻塞的read,也会结束阻塞返回-1,并判断-1是因为连接断开返回的,而结束通信的子进程。

优点:方便 
缺点:不能实时响应

2、C/S心跳机制:

服务器单独的进程/线程每隔几分钟(固定时间)发送一个心跳包给连接到的每个客户端,检测客户端是否存活。如果客户端无回复,重复发送几次,若还无回复则关闭链接。客户端也可以设置心跳进程,若果是服务器异常退出,客户端可以关闭并重新建立链接,如果重新建立几次失败,客户端就会向用户报告出错信息。(自己设置一个服务器的心跳包)。对于心跳机制,首先需要保存所有连接到服务器的客户端信息。

引用:https://blog.csdn.net/apollon_krj/article/details/58174652

posted @ 2018-04-30 16:03  WorldsCollide  阅读(62)  评论(0)    收藏  举报