解决一下 WebView2 不能用 socket5代理的问题。
webview2现在好像还能在启用s5代理的情况下,可以输入账号密码。应该是还没开发这个API。所以曲线解决了一下,记录一下吧。
解决就是自己写代理转发认证一下。直接上代码
/// <summary> /// Socket代理5转发 /// </summary> public class Socket5Forward { #region 类型 Type #region 私有类型 Private /// <summary> /// 进度命令 /// </summary> private enum Command { /// <summary> /// 默认 /// </summary> Default, /// <summary> /// 连接 /// </summary> Connection, /// <summary> /// 验证 /// </summary> Validate, /// <summary> /// 读写 /// </summary> ReadWrite } /// <summary> /// 异步状态对象 /// </summary> private class StateObject { /// <summary> /// 标识 /// </summary> public long IntID { get; set; } /// <summary> /// 客户端-无认证 /// </summary> public Socket ClientSocket { get; set; } /// <summary> /// 客户端-进度 /// </summary> public Command ClientCommand { get; set; } = Command.Default; /// <summary> /// 客户端-数据包 /// </summary> public List<ArraySegment<byte>> ClientRead { get; set; } /// <summary> /// 代理端-需认证 /// </summary> public Socket ProxySocket { get; set; } /// <summary> /// 代理端-进度 /// </summary> public Command ProxyCommand { get; set; } = Command.Default; /// <summary> /// 代理段-数据包 /// </summary> public List<ArraySegment<byte>> ProxyRead { get; set; } } /// <summary> /// 代理数据 /// </summary> public class Proxy { /// <summary> /// 代理IP /// </summary> public string IP { set; get; } /// <summary> /// 代理端口 /// </summary> public int Port { set; get; } /// <summary> /// 代理用户 /// </summary> public string User { set; get; } /// <summary> /// 代理密码 /// </summary> public string Pass { set; get; } } #endregion 私有类型 #region 公开类型 Public #endregion 公开类型 #endregion 类型 #region 属性 Propertie #region 私有属性 Private /// <summary> /// 代理信息 /// </summary> private Proxy ObjProxy { get; set; } /// <summary> /// 自增标识 /// </summary> private long IntID { get; set; } = 0; /// <summary> /// 服务对象 /// </summary> private TcpListener ObjServer { get; set; } #endregion 私有属性 #endregion 属性 #region 构造 Constructor /// <summary> /// 构造对象 /// </summary> /// <param name="sIp">代理IP</param> /// <param name="nPort">代理端口</param> /// <param name="sUser">代理用户</param> /// <param name="sPass">代理密码</param> public Socket5Forward(string sIp, int nPort, string sUser, string sPass) { ObjProxy = new Proxy { IP = sIp, Port = nPort, User = sUser, Pass = sPass }; AddLog(System.Text.Json.JsonSerializer.Serialize(ObjProxy)); } public Socket5Forward(Proxy oProxy) { ObjProxy = oProxy; } #endregion 构造 #region 方法 Method #region 私有方法 Private /// <summary> /// 日志 /// </summary> /// <param name="sMsg"></param> private static void AddLog(string sMsg) { System.Diagnostics.Trace.WriteLine(sMsg); //Console.WriteLine(sMsg); } #region 客户端 /// <summary> /// 客户端-接受连接 /// </summary> /// <param name="iAR"></param> private void ClientAccept(IAsyncResult iAR) { AddLog("客户端-连接"); var listener = iAR.AsyncState as TcpListener; try { var oClientSocket = listener.EndAcceptSocket(iAR); var oProxyScoket = new TcpClient(); var oState = new StateObject { IntID = ++IntID, ClientSocket = oClientSocket, ClientCommand = Command.Connection, ClientRead = new List<ArraySegment<byte>>() { new ArraySegment<byte>(new byte[oClientSocket.ReceiveBufferSize]) }, ProxySocket = oProxyScoket.Client, ProxyRead = new List<ArraySegment<byte>>() { new ArraySegment<byte>(new byte[oClientSocket.ReceiveBufferSize]) } }; _ = oProxyScoket.BeginConnect(ObjProxy.IP, ObjProxy.Port, ProxyConnect, oState); _ = listener.BeginAcceptSocket(ClientAccept, listener); } catch { } } /// <summary> /// 客户端-读取->转发 /// </summary> /// <param name="iAR"></param> private void ClientRead(IAsyncResult iAR) { var oState = iAR.AsyncState as StateObject; try { var nRead = oState.ClientSocket.EndReceive(iAR); if (nRead > 0) { if (oState.ClientCommand == Command.Connection) { AddLog($"[{oState.IntID}]客户端-请求命令"); var nFristMethod = oState.ClientRead[0].Array[2]; _ = oState.ClientSocket.Send(new byte[] { 0x05, nFristMethod }); oState.ClientCommand = Command.ReadWrite; } else if (oState.ClientCommand == Command.ReadWrite) { //var sText = Encoding.UTF8.GetString(oState.ClientRead[0].Array, 0, nRead); //AddLog(sText); var nSend = oState.ProxySocket.Send(oState.ClientRead[0].Array, nRead, SocketFlags.None); AddLog($"[{oState.IntID}]客户端-转发数据包长度:R[{nRead}],S[{nSend}]"); } _ = oState.ClientSocket.BeginReceive(oState.ClientRead, SocketFlags.None, ClientRead, oState); } else { AddLog($"[{oState.IntID}]客户端-关闭:长度不足"); oState.ClientSocket.Close(); oState.ProxySocket.Close(); } } catch (Exception) { AddLog($"[{oState.IntID}]客户端-关闭:异常关闭"); oState.ClientSocket.Close(); oState.ProxySocket.Close(); } } #endregion #region 代理端 /// <summary> /// 代理端-连接完成 /// </summary> /// <param name="iAR"></param> private void ProxyConnect(IAsyncResult iAR) { try { AddLog("代理端已连接"); var oState = iAR.AsyncState as StateObject; oState.ProxySocket.EndConnect(iAR); oState.ProxyCommand = string.IsNullOrEmpty(ObjProxy.User) || string.IsNullOrEmpty(ObjProxy.Pass) ? Command.Validate : Command.Connection; _ = oState.ProxySocket.Send(new byte[] { 0x05, 0x02, 0x00, 0x02 }); _ = oState.ProxySocket.BeginReceive(oState.ProxyRead, SocketFlags.None, ProxyRead, oState); } catch { } } /// <summary> /// 代理端-读取->转发 /// </summary> /// <param name="iAR"></param> private void ProxyRead(IAsyncResult iAR) { var oState = iAR.AsyncState as StateObject; try { var nRead = oState.ProxySocket.EndReceive(iAR); if (nRead > 0) { //AddLog($"[{oState.IntID}]ProxyRead====nRead > 0 nRead=" + nRead); if (oState.ProxyCommand == Command.Connection) { var arrBuf = oState.ProxyRead[0].Array; AddLog($"[{oState.IntID}]代理端-返回连接方法:{arrBuf[0]:x},{arrBuf[1]:x}"); var oStream = new MemoryStream(); oStream.WriteByte(0x1); oStream.WriteByte((byte)ObjProxy.User.Length); oStream.Write(Encoding.ASCII.GetBytes(ObjProxy.User)); oStream.WriteByte((byte)ObjProxy.Pass.Length); oStream.Write(Encoding.ASCII.GetBytes(ObjProxy.Pass)); _ = oState.ProxySocket.Send(oStream.ToArray()); oStream.Close(); oState.ProxyCommand = Command.Validate; } else if (oState.ProxyCommand == Command.Validate) { var arrBuf = oState.ProxyRead[0].Array; AddLog($"[{oState.IntID}]代理端-返回验证结果:{arrBuf[0]:x},{arrBuf[1]:x}"); if (arrBuf[1] == 0x0) { AddLog($"[{oState.IntID}]客户端-接受数据"); _ = oState.ClientSocket.BeginReceive(oState.ClientRead, SocketFlags.None, ClientRead, oState); oState.ProxyCommand = Command.ReadWrite; } else { AddLog($"[{oState.IntID}]代理端-认证错误"); oState.ProxySocket.Close(); oState.ClientSocket.Close(); } } else if (oState.Pro 江西党性培训 www.ctbuganxun.com xyCommand == Command.ReadWrite) { //var sText = Encoding.UTF8.GetString(oState.ProxyRead[0].Array); var nSend = _ = oState.ClientSocket.Send(oState.ProxyRead[0].Array, nRead, SocketFlags.None); AddLog($"[{oState.IntID}]代理端-转发数据包长度:R[{nRead}],S[{nSend}]"); } _ = oState.ProxySocket.BeginReceive(oState.ProxyRead, SocketFlags.None, ProxyRead, oState); } else { AddLog($"[{oState.IntID}]代理端-关闭:长度不足"); oState.ProxySocket.Close(); oState.ClientSocket.Close(); } } catch (Exception) { AddLog($"[{oState.IntID}]代理端-关闭:异常"); oState.ProxySocket.Close(); oState.ClientSocket.Close(); } } #endregion #endregion 私有方法 #region 公开方法 Public /// <summary> /// 开始服务 /// </summary> /// <param name="nProt"></param> public void Start(int nProt) { AddLog("开始"); try { ObjServer = new TcpListener(IPAddress.Any, nProt); ObjServer.Start(); _ = ObjServer.BeginAcceptSocket(ClientAccept, ObjServer); } catch (Exception) { ObjServer = null; } } public void Stop() { ObjServer?.Stop(); } #endregion 公开方法 #endregion 方法 }
解决一下 WebView2 不能用 socket5代理的问题。相关推荐
- vue脚手架解决跨域问题-------配置反向代理
vue脚手架解决跨域问题-------配置反向代理 参考文章: (1)vue脚手架解决跨域问题-------配置反向代理 (2)https://www.cnblogs.com/zbx-boke/p/9 ...
- golang中如何使用http,socket5代理
Golang Http use socket5 proxy 因为最近想爬取一些网站上的视频,无奈网站在墙外,只能通过代理进行爬取,因此在网上搜索关于golang使用代理的方法. 功夫不负有心人,最后我 ...
- py socket5 代理
python socket5 代理 #!/usr/bin/python # Filename s5.py # Python Dynamic Socks5 Proxy # Usage: python s ...
- Chrome浏览器如何使用socket5代理?
Chrome浏览器如何使用socket5代理? 转载:http://helpserver.chiwudaili.com/detail.aspx?id=60222b96a3240a1376eef8a70 ...
- socket5代理简单使用
socket是什么 有两个程序,通过一个双向的通信连接实现数据交换,这个连接的一端就是一个soccet,也叫[套接字]:socket包括IP+端口,一个连接至少需要两个socket,因为连接的一端就是 ...
- 内网穿透究竟解决的是什么问题 与代理的区别
内网穿透究竟解决的是什么问题 & 与代理的区别 参考 猫盘群晖外部网络访问的三种方法:公网IP.内网穿透.qc的实际评测 内网穿透比公网ip稳定性和速度会更好吗?(讨论比较多,有点意思) 内网 ...
- js webpack 解决跨域问题_webpack-dev-server 作代理解决跨域,让你的本地开发飞起来...
最近在接到一个需求是做一个可视化的监控系统,mock数据来开发的话实在不太方便,况且数据量之大.查了一下资料,可以用webpack-dev-server作为代理,直接请求线上,哈哈哈,是不是很方便. ...
- 解决Vue跨域问题 : 正向代理与反向代理
你需要做一个反向代理的东西 ===> 打开你的vue项目的config文件夹下的index.js 找到以下代码 dev: {proxyTable: {'/api': {target: 'ht ...
- 解决Windows系统自带共享代理软件导致的断网问题
当你用无线登录校园网时,有时会出现"Windows系统自带共享代理软件,请您关闭",这是由于你开启了ICS服务和Internet连接共享. 解决方法如下:(假设你使用的是无线网,系 ...
- 解决 go install 第三方包, 连接代理网址 proxy.golang.org 超时
默认使用的是proxy.golang.org,在国内无法访问,如下图所示: bogon:demo-path user$ go install github.com/volatiletech/sqlbo ...
最新文章
- python dlib学习(九):人脸聚类
- 【FI】SAP ODN简介
- Visual Studio Code 使用教程
- VMware View 与 Citrix Xendesktop 管理大比拼
- 子元素增加margin-top会增加给父元素的问题
- android 上线流程
- groovy学习笔记 - 目录
- 51Nod 1494 选举拉票(权值线段树)
- 《C++高级编程(第3版)》
- ES6新特性_ES6语法糖-class的类继承---JavaScript_ECMAScript_ES6-ES11新特性工作笔记036
- 什么是webpack? ----(webpack入门)
- uiswitch样式_可变大小、颜色边框、样式的UISwitch
- 苹果 macOS 系统键盘快捷键列表大全整理
- 用c语言编写游戏中秋博饼,描写中秋节博饼的作文600字
- ISAPI报警模块流程
- 【PhotoShop基础A篇】磨皮/图层/液化
- 代理服务器与反向代理服务器
- vue制作子组件以及在父组件中引入子组件
- 计算机发展的雏形,( )是现代计算机的雏形。
- 【第二届PHP全球开发者大会】惠新宸(鸟哥):PHP7性能之源
热门文章
- 传统蓝牙BR/EDR的搜索Inquiry
- 注册gmail账号,手机无法接受验证码的问题
- 图片特效展示(鼠标移入移除特效)
- jquery获取选中和未选中的checkbox复选框
- [Matlab]中solve函数与subs函数的使用方法
- 梦三国解析服务器spl文件头失败怎么解决,梦三国手游野区BUFF点解析 野区BUFF怎么的打...
- com.weibo.sdk.android.WeiboException: {error:User does not exists!,error_code:20003,request:
- 计算机求圆面积公式,如何计算圆的面积?
- 主权数字货币给世界银行业敲响警钟
- 家庭局域网接入Internet