Open zhaowq32 opened 3 years ago
在连接时使用的是哪个函数?
Wsaconnect
proxychains hook 了 WSAConnect 函数,并强制它同步地完成与 SOCKS5 服务器的连接与协商。因此当 WSAConnect 返回时,代理连接就已经建立。
WSAAsyncSelect函数不是根据WSAConnect的返回值来进行判断,而是根据Socket Handle状态。也就是说当Socket Handle连接到Socks5服务器的时候,就会触发FD_CONNECT事件,进行业务数据的发送,但此时socks5请求及鉴权尚未完成。
这是您使用时实际观察到的情况吗?
之前做类似项目遇到的问题
请您再仔细读一遍我之前说的:
proxychains hook 了 WSAConnect 函数,并强制它同步地完成与 SOCKS5 服务器的连接与协商。因此当 WSAConnect 返回时,代理连接就已经建立。
我没有其他要补充的。
嗯 好的 多谢了
restsharp库存在wsaconnect socks5交互过程未完成就发送业务数据的情况
请提供最小可复现示例(Minimal reproducible example)。
using System;
using System.Net;
using System.Runtime.InteropServices;
using RestSharp;
namespace ConsoleSharpApp
{
class Program
{
public void DoRequest(Action<bool, string> action)
{
try
{
var request = new RestRequest(Method.GET);
//calling server with restClient
var restClient = new RestClient
{
BaseUrl = new Uri("http://pv.sohu.com/cityjson")
};
restClient.ExecuteAsync(request, (response) =>
{
Console.WriteLine(response.StatusCode);
});
}
catch (Exception)
{
action(false, "fail");
}
}
static void doAction(bool ret, string message)
{
if (ret)
{
Console.WriteLine("true,message:" + message);
} else
{
Console.WriteLine("false,message:" + message);
}
}
static void Main(string[] args)
{
Program program = new Program();
Action<bool, string> action = new Action<bool, string>(doAction);
program.DoRequest(action);
Console.ReadLine();
}
}
}
我怀疑是处理事件的ui线程和发起socket请求的线程是不同的,wsaconnect只阻塞了发起socket请求的线程,而处理事件的ui线程在wsaconnect返回前就开始处理业务数据了。
客户端通过WSAAsyncSelect函数异步的监听socket的状态,当WSAGETSELECTEVENT为FD_CONNECT时,发送业务数据。此时proxychains应该连接socks5服务器完毕,但是没有连接真实服务器,此时发送数据应该会失败的吧?