100多行PHP代码实现SOCKS5代理服务器{2}

100多行PHP代码实现SOCKS5代理服务器{2}
100多行PHP代码实现SOCKS5代理服务器,此时使用swoole纯异步写使用状态机来处理数据。有压力,目前访问开源中国木材,但访问网易新闻是压力山。我发现我在其他语言写的代理商,有是一个很大的压力去网易新闻。嘎嘎,学艺不精。
我们不明白swoole深,不知道如何处理才关闭套接字关闭读写,以及如何连接超时、读写超时。在互联网上,我看到作者说他需要使用定时器,所以这是非常麻烦的。因此,该代理在个人使用方面不会有任何问题,但仍然有一种方法可以从产品级别的代理中获得。
如果要使用多核,请使用进程模式并将工作人员数设置为CPU。
< PHP
类的客户
{
公共$连接=真;
公共$数据=;
公共$远程=空;
公共$状态= 0;
}
Class Server
{
公共$客户机= };
公共功能启动()
{
$ SERVER =新swoole_server('0.0.0.0 ',8388,swoole_base,swoole_sock_tcp);
$服务器>集合({
max_conn= > 1000,
daemonize= > 1,
reactor_num= > 1,
worker_num= > 1,
dispatch_mode= > 2,
buffer_output_size= > 128×1024×1024,
open_cpu_affinity= > 1,
open_tcp_nodelay= > 1,
log_file= > 'socks5_server日志,
});
$服务器->上('connect,{ $,'onconnect});
$服务器->上('receive,{ $,'onreceive});
$服务器->对('关闭',{ $,'onclose});
服务器>开始();
}
公共功能连接($ SERVER,FD美元美元,fromid)
{
此客户机{ $ } } =新客户机();
}
公共函数OnReceive($ SERVER,FD fromid美元,美元,美元的数据)
{
($ <客户机{ $ })- >数据- $数据;
解析$;
}
公共函数OnClose($ SERVER,FD美元美元,fromid)
{
$客户机;
$客户端>连接= false;
}
私有函数解析($ server,FD)
{
$客户机;

开关($客户机-状态){
案例0:{
如果(strlen($客户->数据)> = 2){
要求美元=解压(c *,substr($客户->数据,0, 2));
如果($ { 1 })!= 0x05){
回声协议不正确。要求美元{ 1 },php_eol;
$服务器>关闭($ FD);
打破;
}
nmethods美元= $请求{ 2 };
If (strlen ($client->data) > = {2 + $nmethods)
为客户->数据= substr($客户->数据,2 + $ nmethods);
$服务器->发送($ FD, x05 设备);
$客户端> >状态= 1;
}
}
}
案例1:{
如果(strlen($客户->数据)<5)
打破;
要求美元=解压(c *客户->数据,美元);
一美元= $请求{ 4 };
如果(一美元= 0x03){ / /域
domainlen美元= $请求{ 5 };
如果(strlen($客户->数据)<5 + $ domainlen + 2){
打破;
}
$domain = substr($客户->数据,5,domainlen美元);
$港=打开(n,substr($客户->数据,5 + domainlen美元,2)){ 1 };
为客户->数据= substr($客户->数据,5 + $ domainlen + 2);
否则如果}(= = =一美元0x01){ / / IPv4
$domain = long2ip(解包(n,substr($客户->数据,4, 4)){ 1 });
$港=打开(n,substr($客户->数据,8, 2)){ 1 };
为客户->数据= substr($客户->数据,10);
{人}
支持类型:回声。一美元,php_eol;
$服务器>关闭($ FD);
打破;
}

远程=新swoole_client美元(swoole_sock_tcp,swoole_sock_async);
为远程->上('connect功能($ CLI)使用(美元美元美元的客户端,服务器,FD,为远程){
$服务器->发送($ FD, x05 设备设备 X01 设备设备设备设备设备设备);
$客户端> >状态= 2;
$客户机>远程= $远程;
});
远程> >()错误
服务器>发送($ )
echo'connect远程错误。php_eol;
$服务器>关闭($ FD);
});
为远程->上('receive功能($ CLI数据使用(美元)美元美元美元FD,服务器、客户端){
如果(!$客户端>连接){
echo'connection已关闭。php_eol;
返回;
}
元服务器>发送($ FD,$数据);
});
为远程->对('关闭',功能($ CLI)使用(美元美元美元FD,服务器、客户端){
$客户端>;
});
如果(一美元= 0x03){
swoole_async_dns_lookup(合域,功能(主机IP使用美元,美元)(美元美元美元的端口,远程服务器,为FD){
当主机是空进程时,所有看似不存在的域名都被解析为本地网络的外部IP。
如果(空($ IP)| |空($主机)){
答:主机:{主机},IP:{ };
$服务器>关闭($ FD);
返回;
}
远程连接(IP,端口);
});
{人}
远程连接($域,$端口);
}
}
案例2:{
如果(strlen($客户->数据)= 0){
打破;
}
如果($客户端>远程= NULL){
echo'remote连接已关闭。php_eol;
打破;
}

sendbytecount美元=美元客户->远程->发送($客户->数据);
如果($ sendbytecount虚假sendbytecount美元)| | = = =数据){
echo'data长度:',strlen($客户->数据),发送字节数:',sendbytecount美元,php_eol;
echo客户端->数据,php_eol;
$服务器>关闭($ FD);
}
$客户端>数据>;
}
}
}
}

(新服务器())>开始();
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部