[root@localhost socket5]# wget http://sourceforge.net/projects/ss5/files/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz/download
[root@localhost socket5]# tar -zxvf ss5-3.8.9-8.tar.gz
[root@localhost socket5]# cd ss5-3.8.9
[root@localhost ss5-3.8.9]# ./configure
[root@localhost ss5-3.8.9]# make
[root@localhost ss5-3.8.9]# make install
编辑配置文件
[root@localhost ss5-3.8.9]# vi /etc/opt/ss5/ss5.conf
插入
auth0.0.0.0/0 - u
permit u0.0.0.0/0 - 0.0.0.0/0 - - - - -
创建用户名密码
[root@localhost ss5-3.8.9]# vi /etc/opt/ss5/ss5.passwd
一行一个用户名密码,空格隔开
[root@localhost ss5-3.8.9]# chmod +x /etc/init.d/ss5
[root@localhost ss5-3.8.9]# /etc/init.d/ss5 start
[root@localhost ss5-3.8.9]# netstat -nap|grep ss5
tcp0 0 0.0.0.0:10800.0.0.0:* LISTEN 28870/ss5
############################
如果需要限制访问某些ip地址可以增加
permit -0.0.0.0/0 - 1.1.1.1 80 http- - -
permit -0.0.0.0/0 - 2.2.2.2 80 http- - -
规则是按顺序向下匹配,匹配到则通过,否则拒绝
也可以使用域名,这样就只能访问这个域名,但是感觉不好用,子页面无法查看,把域名对应的ip加入后,就可以正常访问网站了
permit -0.0.0.0/0 - www.abc.com 80 http- - -
Linux socket编程的心跳机制总结我写这篇文章的目的是想总结一下心跳机制的使用,因为最近两个项目的TCP通信中都使用了这个方法,感觉比较经典,所以拿出来与大家共享。
什么是心跳机制
心跳机制就是当客户端与服务端建立连接后,每隔几分钟发送一个固定消息给服务端,服务端收到后回复一个固定消息给客户端,如果服务端几分钟内没有收到客户端消息,则视客户端断开。发送方可以是客户端和服务端,看具体需求。
为什么要使用
我们都知道在TCP这种长连接情况下下,有可能有一大段时间是没有数据往来的,即处于空闲状态。理论上说,这个连接是一直保持连接的,但是在实际应用中,如果中间节点出现什么故障是难以预测的。更可怕的是,有的节点会自动把一定时间之内没有数据交互的连接切断。所以,需要我们利用心跳机制,来维持长连接,保活通信。
实现方法
应用层: 由应用程序自己每隔一定时间向客户/服务端发送一个短小的数据包,然后启动一个线程,在线程中不断检测客户端的回应, 如果在一定时间内没有收到客户/服务端的回应,即认为客户/服务端已经掉线,连接不可用。
设置SO_KEEPALIVE套接字选项:在TCP通信中,存在heartbeat机制。其实就是TCP的选项。当服务/客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包, 而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。
注意:因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认并不默认开启KeepAlive。KeepAlive超时需要7,200,000 MilliSeconds, 即2小时,探测次数为5次。对于很多应用程序来说,空闲时间太长。因此,我们可以手工开启KeepAlive功能并设置合理的KeepAlive参数。
我的实现
这里具体介绍设置SO_KEEPALIVE套接字选项这个方法。
SO_KEEPALIVE的三个参数:
tcp_keepalive_intvl:探测发包间隔为intvl。
tcp_keepalive_idle:连接在idle时间内没有任何数据往来,则进行此TCP层的探测。
tcp_keepalive_cnt:尝试探测的次数。
setsockopt()函数介绍
用法:设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。
函数原型:
#include <sys/types.h>
#include <sys/socket.h>
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen)
参数:
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
optname:需要访问的选项名。
optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。
optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EBADF:sock不是有效的文件描述词
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock描述的不是套接字123456789101112131415161718
具体代码
int heartbeat(int fd)
{
int alive,error,idle,cnt,intv
/*
* open keepalive on fd
*/
Restart:
alive = 1//set keepalive open
ret=setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,&alive,sizeof(alive))
if(ret <0)
{
DEBUG("set socket option error.\n")
goto Restart
}
/*
* 60S without data,send heartbeat package
*/
idle = 60
ret = setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,&idle,sizeof(idle))
if(ret <0)
{
DEBUG("set keepalive idle error.\n")
return -1
}
/*
* without any respond,3m later resend package
*/
intv = 180
ret = setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,&intv,sizeof(intv))
if(ret <0)
{
DEBUG("set keepalive intv error.\n")
return -2
}
/*
* send 5 times,without any response,mean connect lose
*/
cnt = 5
ret = setsockopt(fd,SOL_TCP,TCP_KEEPCNT,&cnt,sizeof(cnt))
if(ret <0)
{
DEBUG("set keepalive cnt error.\n")
return -3
}
}
sock5 这个软件啊 具体的过程 如下:1.1 安装依赖开发库
# yum install pam-devel openldap-devel openssl-devel
1.2 安装socks 5
下载后解压
# tar -xzvf ss5-3.8.9-8.tar.gz
# cd ss5-3.8.9
# ./configure
# make
# make install
2. socks 5配置
2.1 修改配置文件
# vim /etc/opt/ss5/ss5.conf
auth 0.0.0.0/0 – -
改为
auth 0.0.0.0/0 – u
permit – 0.0.0.0/0 – 0.0.0.0/0 – – – – -
改成为
permit u 0.0.0.0/0 – 0.0.0.0/0 – – – – -
3. 添加socket 5用户
# cat /etc/opt/ss5/ss5.passwd
##用户 密码
ttlsa 123456
4. 启动socket 5
# sh /etc/rc.d/init.d/ss5 start
doneting ss5...
默认情况ss5文件没有执行权限,如果觉得使用sh来启动麻烦,那么按如下方法:
# chmod u+x /etc/rc.d/init.d/ss5
# chkconfig --add ss5 //可选
# chkconfig ss5 on //可选
# service ss5 start
5. 查看是否启动
# netstat -lntp | grep ss5
tcp0 0 0.0.0.0:1080 0.0.0.0:* LISTEN 14262/ss5
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)