100多行PHP代码实现socks5代理服务器[2]_PHP
100多行PHP代码实现socks5代理服务器,这次是使用swoole纯异步来写,使用状态机来处理数据。目前用它访问开源中国木有压力,但访问网易新闻就压力山大。我发现我用别的语言写得代理,访问网易新闻都压力大。嘎嘎,学艺不精。
对swoole理解不深,不知道怎么处理socket shutdown只关闭读/写这样,还有就是连接超时,读写超时这种怎么处理。在网上看到作者说要用定时器,感觉好麻烦,所以,这次的代理,虽然个人用,一般不会有什么问题,但离产品级的代理,还有段路要走。
如果要利用多核,就使用process模式,设置worker个数为cpu数量即可。
<?php class Client { public $connected = true; public $data = ''; public $remote = null; public $status = 0; } class Server { public $clients = []; public function start() { $server = new swoole_server('0.0.0.0', 8388, SWOOLE_BASE, SWOOLE_SOCK_TCP); $server->set([ '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.log', ]); $server->on('connect', [$this, 'onConnect']); $server->on('receive', [$this, 'onReceive']); $server->on('close', [$this, 'onClose']); $server->start(); } public function onConnect($server, $fd, $fromID) { $this->clients[$fd] = new Client(); } public function onReceive($server, $fd, $fromID, $data) { ($this->clients[$fd])->data .= $data; $this->parse($server, $fd); } public function onClose($server, $fd, $fromID) { $client = $this->clients[$fd]; $client->connected = false; } private function parse($server, $fd) { $client = $this->clients[$fd]; switch ($client->status) { case 0: { if (strlen($client->data) >= 2) { $request = unpack('c*', substr($client->data, 0, 2)); if ($request[1] !== 0x05) { echo '协议不正确:' . $request[1], PHP_EOL; $server->close($fd); break; } $nmethods = $request[2]; if (strlen($client->data) >= 2 + $nmethods) { $client->data = substr($client->data, 2 + $nmethods); $server->send($fd, "\x05\x00"); $client->status = 1; } } } case 1: { if (strlen($client->data) < 5) break; $request = unpack('c*', $client->data); $aType = $request[4]; if ($aType === 0x03) { // domain $domainLen = $request[5]; if (strlen($client->data) < 5 + $domainLen + 2) { break; } $domain = substr($client->data, 5, $domainLen); $port = unpack('n', substr($client->data, 5 + $domainLen, 2))[1]; $client->data = substr($client->data, 5 + $domainLen + 2); } else if ($aType === 0x01) { // ipv4 $domain = long2ip(unpack('N', substr($client->data, 4, 4))[1]); $port = unpack('n', substr($client->data, 8, 2))[1]; $client->data = substr($client->data, 10); } else { echo '不支持的atype:' . $aType, PHP_EOL; $server->close($fd); break; } $remote = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); $remote->on('connect', function($cli) use($client, $server, $fd, $remote) { $server->send($fd, "\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00"); $client->status = 2; $client->remote = $remote; }); $remote->on("error", function(swoole_client $cli) use($server, $fd) { //$server->send($fd, ""); // todo 连接不上remote echo 'connect to remote error.', PHP_EOL; $server->close($fd); }); $remote->on('receive', function($cli, $data) use($server, $fd, $client) { if (!$client->connected) { echo 'connection has been closed.', PHP_EOL; return; } $server->send($fd, $data); }); $remote->on('close', function($cli) use($server, $fd, $client) { $client->remote = null; }); if ($aType === 0x03) { swoole_async_dns_lookup($domain, function($host, $ip) use($remote, $port, $server, $fd) { //todo 当host为空时的处理。貌似不存在的域名都解析成了本机的外网ip,奇怪 if (empty($ip) || empty($host)) { echo "host:{$host}, ip:{$ip}\n"; $server->close($fd); return; } $remote->connect($ip, $port); }); } else { $remote->connect($domain, $port); } } case 2: { if (strlen($client->data) === 0) { break; } if ($client->remote === null) { echo 'remote connection has been closed.', PHP_EOL; break; } $sendByteCount = $client->remote->send($client->data); if ($sendByteCount === false || $sendByteCount < strlen($client->data)) { echo 'data length:' , strlen($client->data), ' send byte count:', $sendByteCount, PHP_EOL; echo $client->data, PHP_EOL; $server->close($fd); } $client->data = ''; } } } } (new Server())->start();

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。
