当前位置: 技术问答>linux和unix
专门为难C或unix高手,recv或read之超时问题
来源: 互联网 发布时间:2016-04-24
本文导语: 开发平台 solaris 10 工具gcc 3.4.6 为了避免客户端与服务端建立连接套接字之后,客户端恶意连接但不发数据,从而造成大量连接,直到消耗完所有连接套接字。 说的形象点,为了避免DDOS攻击,现考虑到三个解决r...
开发平台 solaris 10
工具gcc 3.4.6
为了避免客户端与服务端建立连接套接字之后,客户端恶意连接但不发数据,从而造成大量连接,直到消耗完所有连接套接字。
说的形象点,为了避免DDOS攻击,现考虑到三个解决recv或者read套接字的阻塞时间的方法:
1、使用setsockopt设置socket选项
SO_RCVTIMEO接收超时时间设置
但是solaris下的setsockopt函数根本不支持对SO_RCVTIMEO进行设置,总是函数出错,此办法行不通。
2、使用select检测来解决,但是这个只能检测出套接字什么时候可读,没办法解决recv函数本身调用过程中的阻塞。
3、使用alarm函数 (目前这种方式好像最好),请unix下的C高手给出一段高效代码!感谢之。
工具gcc 3.4.6
为了避免客户端与服务端建立连接套接字之后,客户端恶意连接但不发数据,从而造成大量连接,直到消耗完所有连接套接字。
说的形象点,为了避免DDOS攻击,现考虑到三个解决recv或者read套接字的阻塞时间的方法:
1、使用setsockopt设置socket选项
SO_RCVTIMEO接收超时时间设置
但是solaris下的setsockopt函数根本不支持对SO_RCVTIMEO进行设置,总是函数出错,此办法行不通。
2、使用select检测来解决,但是这个只能检测出套接字什么时候可读,没办法解决recv函数本身调用过程中的阻塞。
3、使用alarm函数 (目前这种方式好像最好),请unix下的C高手给出一段高效代码!感谢之。
|
DDOS不能放到应用程序本身里来防范。
select检测到可读时,recv不用阻塞了啊。
你可以把每个套接字监控起来,只要这个套接字超过一定的时间没有收到数据就关掉这个套接字就可以解决你的问题了啊。
select检测到可读时,recv不用阻塞了啊。
你可以把每个套接字监控起来,只要这个套接字超过一定的时间没有收到数据就关掉这个套接字就可以解决你的问题了啊。
|
即使用信号驱动模型,和select一样只是等待数据不阻塞,但是从内核读取拷贝数据还是阻塞的。
用异步I/Q.
用异步I/Q.
|
看来楼主对这个了解不够深入啊
有一种叫sync flood的攻击,你在应用层是完全控制不了的
只能通过防火墙
有一种叫sync flood的攻击,你在应用层是完全控制不了的
只能通过防火墙
|
防止ddos不是从你的app级别防止的。应该是硬件或软件防火墙。
用select就可以解决读系统调用超时的情况(这不是攻击)。用alarm函数,要保证,你的系统支持“被中断的系统调用”,并且被中断的系统调用不会自动重启。如果会自动重启还要调用sigaction函数对SIGALRM信号设置一下。
比如你要等待5秒,就
alarm(5);
read(...);
如果是超时,alarm会返回-1, errno是EINTR。
|
同意的啦。