Linux 网络编程(二)
发布日期:2021-06-29 04:57:45 浏览次数:2 分类:技术文章

本文共 1520 字,大约阅读时间需要 5 分钟。

 

一、基本知识

1.1、心跳机制

 面向连接的TCP连接,在实际的应用中经常需要检测连接是否断开。而在实际的连接过程中,连接断开分为两种情况:

      1、客户端正常关闭。即客户端通过调用close,shutdown来正常关闭socket。此时服务端通过read和write的返回值来判断客户端是否正常
   关闭0表示,-1表示读写错误。均可以表示连接正常断开。
      2、客户端非正常关闭。比如说网络断开,wifi连接失效断开等的非正常断开。此时,不能通过read和write判断,这两个函数将不能判断
    socket已经失效。需要通过其他方式来判断连接是否断开。判断方式有以下两种:
      1、TCP通信的双方定时发送数据包,通过判断是否收到对方的数据包以检测对方是否在线。
      2、利用Socket的KEEP_ALIVE 机制,来定时给对方发送一个"探测存活数据包",当超过一定时间对方没有回复ACK,则视为连接断开,此时
    调用read或者write时,将返回错误信息。我们可以通过判断错误信息来检测链接已经断开。

两者的优劣:

方法一:需要客户端与服务端协商好双方的通信协议,需要双方的应用层程序通信作出修改,比较不灵活。
方法二:默认状态下,KEEP_ALIVE 机制判断tcp链接是否断开需要发送心跳包来检测,由于发送心跳包的工作由tcp得协议栈来做,应用层只需要 对链接两端的TCP socket 设置keep alive 机制,进行监听即可。这种方法实现较为方便。

方法三:在select中阻塞等待I/O(select有内置的时间限制),依次代替直接阻塞在read或write调用上。(linux2.6以后的内核也可以使用epoll的epoll_wait)

1.1.1 select

网络编程中socket的分量我想大家都很清楚了,socket也就是套接口,在套接口编程中,提到超时的概念,我们一下子就能想到3个:发送超时,接收超时,以及select超时(注: select函数并不是只用于套接口的,但是套接口编程中用的比较多),在connect到目标主机的时候,这个超时是不由我们来设置的。不过正常情况下这个超时都很长,并且connect又是一个阻塞方法,一个主机不能连接,等着connect返回还能忍受,你的程序要是要试图连接多个主机,恐怕遇到多个不能连接的主机的时候,会塞得你受不了的。我也废话少说,先说说我的方法,如果你觉得你已掌握这种方法,你就不用再看下去了,如果你还不了解,我愿意与你分享。本文是已在Linux下的程序为例子,不过拿到Windows中方法也是一样,无非是换几个函数名字罢了。

Linux中要给connect设置超时,应该是有两种方法的。一种是该系统的一些参数,这个方法我不讲,因为我讲不清楚:P,它也不是编程实现的。另外一种方法就是变相的实现connect的超时,我要讲的就是这个方法,原理上是这样的:
1.建立socket
2.将该socket设置为非阻塞模式
3.调用connect()
4.使用select()检查该socket描述符是否可写(注意,是可写)
5.根据select()返回的结果判断connect()结果
6.将socket设置为阻塞模式(如果你的程序不需要用阻塞模式的,这步就省了,不过一般情况下都是用阻塞模式的,这样也容易管理)
如果你对网络编程很熟悉的话,其实我一说出这个过程你就知道怎么写你的程序了,下面给出我写的一段程序,仅供参考。

1.1.2 客户端与服务端协商好双方的通信协议

 

1.1.3  setsockopt

使用套接字选项SO_SNDTIMEO、SO_RCVTIMEO

1.1.4 参考网址

 

转载地址:https://blog.csdn.net/zhang_yin_liang/article/details/70911646 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:GNU make项目管理学习笔记
下一篇:exit函数和return返回之间的区别

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月11日 00时45分01秒