通过C#语言配置IPNut 代理:
进入 IPNut 平台购买并获取信息,这里以静态IP为例(假如端口是 http://proxy.ipnut.com:28001,账号: ipnut,密码: 123456789)。
1. SOCKS5代理示例 #
/**
* SOCKS5代理演示 - C#
*/
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace ProxyDemo
{
public class Socks5ProxyDemo
{
private readonly string proxyHost = "proxy.ipnut.com";
private readonly int proxyPort = 28001;
private readonly string proxyUsername = "ipnut";
private readonly string proxyPassword = "123456789";
/**
* 连接到SOCKS5代理服务器
*/
private async Task ConnectToSocks5ProxyAsync()
{
try
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 解析代理服务器地址
var hostEntry = await Dns.GetHostEntryAsync(proxyHost);
var proxyEndPoint = new IPEndPoint(hostEntry.AddressList[0], proxyPort);
await socket.ConnectAsync(proxyEndPoint);
Console.WriteLine("成功连接到SOCKS5代理服务器");
return socket;
}
catch (Exception ex)
{
Console.WriteLine($"连接到代理服务器失败: {ex.Message}");
return null;
}
}
/**
* SOCKS5认证握手
*/
private async Task Socks5AuthenticateAsync(Socket socket)
{
try
{
// SOCKS5握手包
byte[] handshake = new byte[]
{
0x05, // SOCKS版本5
0x02, // 认证方法数量
0x00, // 无认证
0x02 // 用户名密码认证
};
await socket.SendAsync(new ArraySegment(handshake), SocketFlags.None);
// 接收服务器响应
byte[] response = new byte[2];
int bytesReceived = await socket.ReceiveAsync(new ArraySegment(response), SocketFlags.None);
if (bytesReceived < 2)
{
Console.WriteLine("接收握手响应失败");
return false;
}
if (response[0] != 0x05)
{
Console.WriteLine("不支持的SOCKS版本");
return false;
}
// 如果需要用户名密码认证
if (response[1] == 0x02)
{
return await Socks5UsernamePasswordAuthAsync(socket);
}
else if (response[1] != 0x00)
{
Console.WriteLine($"不支持的认证方法: {response[1]}");
return false;
}
return true;
}
catch (Exception ex)
{
Console.WriteLine($"SOCKS5认证失败: {ex.Message}");
return false;
}
}
/**
* SOCKS5用户名密码认证
*/
private async Task Socks5UsernamePasswordAuthAsync(Socket socket)
{
try
{
var authPacket = new System.Collections.Generic.List();
authPacket.Add(0x01); // 认证版本
authPacket.Add((byte)proxyUsername.Length);
authPacket.AddRange(Encoding.UTF8.GetBytes(proxyUsername));
authPacket.Add((byte)proxyPassword.Length);
authPacket.AddRange(Encoding.UTF8.GetBytes(proxyPassword));
await socket.SendAsync(new ArraySegment(authPacket.ToArray()), SocketFlags.None);
byte[] authResponse = new byte[2];
int bytesReceived = await socket.ReceiveAsync(new ArraySegment(authResponse), SocketFlags.None);
if (bytesReceived < 2)
{
Console.WriteLine("接收认证响应失败");
return false;
}
if (authResponse[0] != 0x01 || authResponse[1] != 0x00)
{
Console.WriteLine("SOCKS5认证失败");
return false;
}
Console.WriteLine("SOCKS5认证成功");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"用户名密码认证失败: {ex.Message}");
return false;
}
}
/**
* 通过SOCKS5代理连接目标服务器
*/
private async Task Socks5ConnectToTargetAsync(Socket socket, string targetHost, int targetPort)
{
try
{
var connectPacket = new System.Collections.Generic.List();
connectPacket.Add(0x05); // SOCKS版本
connectPacket.Add(0x01); // CONNECT命令
connectPacket.Add(0x00); // 保留
// 域名类型
connectPacket.Add(0x03); // 域名
connectPacket.Add((byte)targetHost.Length);
connectPacket.AddRange(Encoding.UTF8.GetBytes(targetHost));
// 端口
connectPacket.Add((byte)((targetPort >> 8) & 0xFF));
connectPacket.Add((byte)(targetPort & 0xFF));
await socket.SendAsync(new ArraySegment(connectPacket.ToArray()), SocketFlags.None);
// 接收连接响应
byte[] connectResponse = new byte[10];
int bytesReceived = await socket.ReceiveAsync(new ArraySegment(connectResponse), SocketFlags.None);
if (bytesReceived < 2)
{
Console.WriteLine("接收连接响应失败");
return false;
}
if (connectResponse[0] != 0x05 || connectResponse[1] != 0x00)
{
Console.WriteLine($"SOCKS5连接失败,代码: {connectResponse[1]}");
return false;
}
Console.WriteLine("通过SOCKS5代理成功连接到目标服务器");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"SOCKS5连接目标失败: {ex.Message}");
return false;
}
}
/**
* 通过SOCKS5代理发送HTTP请求
*/
public async Task SendHttpRequestViaSocks5Async(string targetHost, int targetPort, string path = "/ip")
{
Console.WriteLine($"=== 通过SOCKS5代理发送HTTP请求 ===");
var socket = await ConnectToSocks5ProxyAsync();
if (socket == null) return;
try
{
if (!await Socks5AuthenticateAsync(socket))
return;
if (!await Socks5ConnectToTargetAsync(socket, targetHost, targetPort))
return;
// 发送HTTP请求
string httpRequest =
$"GET {path} HTTP/1.1\r\n" +
$"Host: {targetHost}\r\n" +
"User-Agent: CSharp-SOCKS5-Proxy/1.0\r\n" +
"Connection: close\r\n" +
"\r\n";
byte[] requestBytes = Encoding.UTF8.GetBytes(httpRequest);
await socket.SendAsync(new ArraySegment(requestBytes), SocketFlags.None);
// 接收HTTP响应
Console.WriteLine("HTTP响应:");
byte[] buffer = new byte[4096];
int bytesReceived;
while ((bytesReceived = await socket.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None)) > 0)
{
string response = Encoding.UTF8.GetString(buffer, 0, bytesReceived);
Console.Write(response);
}
Console.WriteLine();
}
catch (Exception ex)
{
Console.WriteLine($"请求失败: {ex.Message}");
}
finally
{
socket?.Close();
}
}
/**
* 使用HttpClient通过SOCKS5代理
*/
public async Task UseHttpClientWithSocks5Async()
{
Console.WriteLine("=== 使用HttpClient通过SOCKS5代理 ===");
try
{
// 创建自定义HttpClientHandler使用SOCKS5代理
var handler = new HttpClientHandler
{
Proxy = new WebProxy($"socks5://{proxyUsername}:{proxyPassword}@{proxyHost}:{proxyPort}"),
UseProxy = true
};
using var httpClient = new HttpClient(handler);
httpClient.Timeout = TimeSpan.FromSeconds(30);
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("CSharp-SOCKS5-HttpClient/1.0");
var response = await httpClient.GetAsync("http://httpbin.org/ip");
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine($"状态码: {response.StatusCode}");
Console.WriteLine($"响应内容: {content}");
}
catch (Exception ex)
{
Console.WriteLine($"HttpClient请求失败: {ex.Message}");
}
}
/**
* 运行SOCKS5演示
*/
public async Task RunDemoAsync()
{
Console.WriteLine("开始SOCKS5代理测试...\n");
// 测试Socket方式
await SendHttpRequestViaSocks5Async("httpbin.org", 80, "/ip");
await SendHttpRequestViaSocks5Async("httpbin.org", 80, "/user-agent");
await SendHttpRequestViaSocks5Async("httpbin.org", 80, "/headers");
// 测试HttpClient方式
await UseHttpClientWithSocks5Async();
Console.WriteLine("SOCKS5代理测试完成!");
}
}
}
2. HTTP代理示例 #
/**
* HTTP代理演示 - C#
*/
using System;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace ProxyDemo
{
public class HttpProxyDemo
{
private readonly string proxyHost = "proxy.ipnut.com";
private readonly int proxyPort = 28001;
private readonly string proxyUsername = "ipnut";
private readonly string proxyPassword = "123456789";
/**
* 使用HttpClient通过HTTP代理
*/
public async Task UseHttpClientWithHttpProxyAsync()
{
Console.WriteLine("=== 使用HttpClient通过HTTP代理 ===");
try
{
// 创建代理凭据
var proxy = new WebProxy($"http://{proxyHost}:{proxyPort}")
{
Credentials = new NetworkCredential(proxyUsername, proxyPassword)
};
var handler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true,
PreAuthenticate = true
};
using var httpClient = new HttpClient(handler);
httpClient.Timeout = TimeSpan.FromSeconds(30);
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("CSharp-HTTP-Proxy/1.0");
// 测试多个端点
string[] testUrls = {
"http://httpbin.org/ip",
"http://httpbin.org/user-agent",
"http://httpbin.org/headers"
};
foreach (string url in testUrls)
{
Console.WriteLine($"\n请求: {url}");
try
{
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine($"状态码: {response.StatusCode}");
Console.WriteLine($"响应内容: {content}");
}
catch (Exception ex)
{
Console.WriteLine($"请求失败: {ex.Message}");
}
await Task.Delay(1000); // 避免请求过快
}
}
catch (Exception ex)
{
Console.WriteLine($"HttpClient请求失败: {ex.Message}");
}
}
/**
* 使用WebClient通过HTTP代理
*/
public async Task UseWebClientWithHttpProxyAsync()
{
Console.WriteLine("\n=== 使用WebClient通过HTTP代理 ===");
try
{
using var webClient = new WebClient();
// 设置代理
webClient.Proxy = new WebProxy($"http://{proxyHost}:{proxyPort}")
{
Credentials = new NetworkCredential(proxyUsername, proxyPassword)
};
webClient.Headers["User-Agent"] = "CSharp-WebClient-Proxy/1.0";
webClient.Headers["Accept"] = "application/json";
string response = await webClient.DownloadStringTaskAsync("http://httpbin.org/ip");
Console.WriteLine($"响应内容: {response}");
}
catch (Exception ex)
{
Console.WriteLine($"WebClient请求失败: {ex.Message}");
}
}
/**
* 使用Socket通过HTTP代理(CONNECT方法)
*/
public async Task UseSocketWithHttpProxyAsync()
{
Console.WriteLine("\n=== 使用Socket通过HTTP代理(CONNECT方法) ===");
Socket socket = null;
try
{
// 连接到代理服务器
var hostEntry = await Dns.GetHostEntryAsync(proxyHost);
var proxyEndPoint = new IPEndPoint(hostEntry.AddressList[0], proxyPort);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
await socket.ConnectAsync(proxyEndPoint);
Console.WriteLine("成功连接到HTTP代理服务器");
// 构建认证信息
string auth = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{proxyUsername}:{proxyPassword}"));
// 发送CONNECT请求
string connectRequest =
$"CONNECT httpbin.org:80 HTTP/1.1\r\n" +
$"Host: httpbin.org:80\r\n" +
$"Proxy-Authorization: Basic {auth}\r\n" +
$"User-Agent: CSharp-Socket-Proxy/1.0\r\n" +
$"Connection: keep-alive\r\n" +
$"\r\n";
byte[] requestBytes = Encoding.UTF8.GetBytes(connectRequest);
await socket.SendAsync(new ArraySegment(requestBytes), SocketFlags.None);
// 读取代理响应
byte[] buffer = new byte[4096];
int bytesReceived = await socket.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None);
string response = Encoding.UTF8.GetString(buffer, 0, bytesReceived);
if (!response.Contains("200 Connection established"))
{
Console.WriteLine($"代理连接失败: {response}");
return;
}
Console.WriteLine("通过HTTP代理成功连接到目标服务器");
// 发送HTTP请求
string httpRequest =
"GET /ip HTTP/1.1\r\n" +
"Host: httpbin.org\r\n" +
"User-Agent: CSharp-Socket-Proxy/1.0\r\n" +
"Connection: close\r\n" +
"\r\n";
byte[] httpRequestBytes = Encoding.UTF8.GetBytes(httpRequest);
await socket.SendAsync(new ArraySegment(httpRequestBytes), SocketFlags.None);
// 读取HTTP响应
Console.WriteLine("HTTP响应:");
StringBuilder responseBuilder = new StringBuilder();
while ((bytesReceived = await socket.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None)) > 0)
{
responseBuilder.Append(Encoding.UTF8.GetString(buffer, 0, bytesReceived));
}
Console.WriteLine(responseBuilder.ToString());
}
catch (Exception ex)
{
Console.WriteLine($"Socket请求失败: {ex.Message}");
}
finally
{
socket?.Close();
}
}
/**
* HTTP代理POST请求演示
*/
public async Task HttpProxyPostRequestAsync()
{
Console.WriteLine("\n=== HTTP代理POST请求演示 ===");
try
{
var proxy = new WebProxy($"http://{proxyHost}:{proxyPort}")
{
Credentials = new NetworkCredential(proxyUsername, proxyPassword)
};
var handler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
using var httpClient = new HttpClient(handler);
httpClient.Timeout = TimeSpan.FromSeconds(30);
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("CSharp-HTTP-POST-Proxy/1.0");
var postData = new
{
name = "ipnut_user",
email = "user@ipnut.com",
message = "测试HTTP代理POST请求"
};
string json = System.Text.Json.JsonSerializer.Serialize(postData);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://httpbin.org/post", content);
response.EnsureSuccessStatusCode();
string responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"状态码: {response.StatusCode}");
Console.WriteLine($"响应内容: {responseContent}");
}
catch (Exception ex)
{
Console.WriteLine($"POST请求失败: {ex.Message}");
}
}
/**
* 运行HTTP代理演示
*/
public async Task RunDemoAsync()
{
Console.WriteLine("开始HTTP代理测试...\n");
await UseHttpClientWithHttpProxyAsync();
await UseWebClientWithHttpProxyAsync();
await UseSocketWithHttpProxyAsync();
await HttpProxyPostRequestAsync();
Console.WriteLine("HTTP代理测试完成!");
}
}
}
3. 代理测试工具:ProxyTestTool.cs #
/**
* 代理测试工具 - C#
*/
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace ProxyDemo
{
public class ProxyTestTool
{
private readonly string proxyHost = "proxy.ipnut.com";
private readonly int proxyPort = 28001;
private readonly string proxyUsername = "ipnut";
private readonly string proxyPassword = "123456789";
/**
* 测试SOCKS5代理
*/
public async Task TestSocks5ProxyAsync()
{
Console.WriteLine("测试 SOCKS5 代理:");
try
{
var handler = new HttpClientHandler
{
Proxy = new WebProxy($"socks5://{proxyUsername}:{proxyPassword}@{proxyHost}:{proxyPort}"),
UseProxy = true
};
using var httpClient = new HttpClient(handler);
httpClient.Timeout = TimeSpan.FromSeconds(15);
var response = await httpClient.GetAsync("http://httpbin.org/ip");
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine("✅ SOCKS5 代理连接成功");
Console.WriteLine($" 状态码: {response.StatusCode}");
Console.WriteLine($" 当前IP: {content}");
}
catch (Exception ex)
{
Console.WriteLine($"❌ SOCKS5 代理连接失败: {ex.Message}");
}
}
/**
* 测试HTTP代理
*/
public async Task TestHttpProxyAsync()
{
Console.WriteLine("\n测试 HTTP 代理:");
try
{
var proxy = new WebProxy($"http://{proxyHost}:{proxyPort}")
{
Credentials = new NetworkCredential(proxyUsername, proxyPassword)
};
var handler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
using var httpClient = new HttpClient(handler);
httpClient.Timeout = TimeSpan.FromSeconds(15);
var response = await httpClient.GetAsync("http://httpbin.org/ip");
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine("✅ HTTP 代理连接成功");
Console.WriteLine($" 状态码: {response.StatusCode}");
Console.WriteLine($" 当前IP: {content}");
}
catch (Exception ex)
{
Console.WriteLine($"❌ HTTP 代理连接失败: {ex.Message}");
}
}
/**
* 运行测试
*/
public async Task RunTestsAsync()
{
Console.WriteLine("=== 代理测试工具 ===\n");
await TestSocks5ProxyAsync();
await TestHttpProxyAsync();
Console.WriteLine("\n代理测试完成!");
}
}
}
4. 主程序文件:Program.cs #
/**
* 主程序 - 代理演示总入口
*/
using System;
using System.Threading.Tasks;
namespace ProxyDemo
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("C#代理连接演示程序");
Console.WriteLine("==================\n");
// 运行代理测试工具
var testTool = new ProxyTestTool();
await testTool.RunTestsAsync();
Console.WriteLine("\n" + new string('=', 50) + "\n");
// 运行SOCKS5演示
var socks5Demo = new Socks5ProxyDemo();
await socks5Demo.RunDemoAsync();
Console.WriteLine("\n" + new string('=', 50) + "\n");
// 运行HTTP演示
var httpDemo = new HttpProxyDemo();
await httpDemo.RunDemoAsync();
Console.WriteLine("\n所有演示完成!");
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
}
5. 项目配置文件:ProxyDemo.csproj #
Exe
net6.0
enable
enable
6. 编译和运行说明 #
# 1.创建新项目
dotnet new console -n ProxyDemo
cd ProxyDemo
# 2.将上面的代码文件添加到项目中,并编译和运行:
# bash
# 编译项目
dotnet build
# 2.运行程序
dotnet run
# 3.发布版本
dotnet publish -c Release
# 4.运行完整演示:
# bash
dotnet run
# 5.单独运行SOCKS5演示:
# csharp
// 在Program.cs中注释掉其他部分,只保留:
var socks5Demo = new Socks5ProxyDemo();
await socks5Demo.RunDemoAsync();
# 6.单独运行HTTP演示:
# csharp
// 在Program.cs中注释掉其他部分,只保留:
var httpDemo = new HttpProxyDemo();
await httpDemo.RunDemoAsync();