下面是一个UDP代理的问题,
先交代一下环境,
我这里是通过一台运行了CCProxy这个代理服务器软件的电脑来上网的。现写了一个UDP的代理,
并进行了代理的测试,
测试用的服务器端运行在服务器上,
而进行测试的客户端运行在我自己的机子上。我的本机IP是:192.168.2.15
服务器的IP是:192.168.2.1,
在服务器上运行CCProxy这个代理服务器软件,
同时,也运行了为测试UDP代理的服务器端。进行测试的思路是这样,
通过(192.168.2.1:1080)和服务器进行协商,
通过后,以得到的IP和端口进行UDP的连接,
去访问目标地址,如(121.31.31.26:9050),
这个目标地址是服务器的公网IP,
进行数据的收发。但在发送消息给服务器端的时候,
服务器端会出错,
出错的信息提示如下:
“未处理的异常: System.Net.Sockets.SocketException:
一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,
或该用户用于接收数据报的缓冲器比数据报小。”现在向大家请教,
关于UDP代理应该什么写?我写过的代码如下:
------------------------------------------------
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Text;
//using UDPProxyTest.Proxy;namespace UDPProxyTest
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string Username = "username";
string Password = "password";
string str1 = ""; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接服务器
s.Connect(IPAddress.Parse("192.168.2.1"), 1080); //认证方式的协商
s.Send(new byte[] { 5, 2, 0, 2 });//
byte[] ret = new byte[2]; s.Receive(ret);
str1 = "认证方式的协商的返回值:\t";
Console.WriteLine(str1);
str1 = ret[0].ToString() + " " + ret[1].ToString();
Console.WriteLine(str1); //用户名和密码认证
if (ret[1].ToString() == "2")//如果支持用户名和密码认证,则执行IF里面的语句
{
byte[] buffer = new byte[3 + Username.Length + Password.Length];
buffer[0] = 1;
buffer[1] = (byte)Username.Length;
Array.Copy(Encoding.ASCII.GetBytes(Username), 0, buffer, 2, Username.Length);
buffer[Username.Length + 2] = (byte)Password.Length;
Array.Copy(Encoding.ASCII.GetBytes(Password), 0, buffer, Username.Length + 3, Password.Length);
s.Send(buffer);
data = new byte[1024];
s.Receive(data);
str1 = "用户名和密码认证\t" + data[1].ToString();
Console.WriteLine(str1);
} //发送具体请求
byte[] connect = new byte[10];
connect[0] = 5;//VER
connect[1] = 3;//CMD
connect[2] = 0;//RSV
connect[3] = 1;//ATYP
connect[4] = 121;//DST.ADDR
connect[5] = 31;
connect[6] = 31;
connect[7] = 26;
int port = 9050;//端口
connect[8] = (byte)(port / 256);//DST.PORT
connect[9] = (byte)(port % 256); s.Send(connect);//发消息
data = new byte[11];
s.Receive(data);
str1 = "发出具体请求的返回值:";
Console.WriteLine(str1);
str1 = data[0] + " " + data[1] + " " + data[2] + " " + data[3] + " " + data[4] + " " + data[5] + " " + data[6] + " " +
data[7] + " " + data[8] + " " + data[9];
Console.WriteLine("<{0}>", str1);
Console.WriteLine();
//发送UDP数据
Console.WriteLine("转发UDP数据包");
string udpAddress = data[4].ToString() + "." + data[5].ToString() + //udpAddress为协商得到的IP地址
"." + data[6].ToString() + "." + data[7].ToString();
byte[] bRet = new byte[10];
bRet[0] = data[9];
bRet[1] = data[8];
int nPort = BitConverter.ToInt32(bRet, 0);//nPort为协商得到的端口
Console.WriteLine("UDP连接的目标地址:{0}:{1}",udpAddress,nPort.ToString()); byte[] udpHead = new byte[11];//对要发送的UDP消息的进行构造
udpHead[0] = 0;//RSV
udpHead[1] = 0;
udpHead[2] = 0;//FRAG
udpHead[3] = 1;//ATYP
udpHead[4] = 121;//DST.ADDR
udpHead[5] = 31;
udpHead[6] = 31;
udpHead[7] = 26;
port = 9050;//DST.PORT
udpHead[8] = (byte)(port / 256);;
udpHead[9] = (byte)(port % 256);
udpHead[10] = 65;//DATA在这里,我仅发送了一个数据 IPEndPoint udpIqep = new IPEndPoint(IPAddress.Parse(udpAddress),nPort);
Socket sUDP = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//UDP套接字 int sent = sUDP.SendTo(udpHead,udpIqep);//发送数据
Console.WriteLine("发送了<{0}>字节",sent.ToString()); IPEndPoint tempIp = new IPEndPoint(IPAddress.Any,0);
EndPoint remote = (EndPoint)tempIp;
byte[] bReceive=new byte[1024];
int recv = sUDP.ReceiveFrom(bReceive,ref remote);//接收数据
Console.WriteLine("接收了<{0}>字节", recv.ToString()); //
sUDP.Close();
s.Close();
Console.WriteLine("关闭套接字!");
Console.ReadLine();
}
}
}-----------------------------------------------------------
先交代一下环境,
我这里是通过一台运行了CCProxy这个代理服务器软件的电脑来上网的。现写了一个UDP的代理,
并进行了代理的测试,
测试用的服务器端运行在服务器上,
而进行测试的客户端运行在我自己的机子上。我的本机IP是:192.168.2.15
服务器的IP是:192.168.2.1,
在服务器上运行CCProxy这个代理服务器软件,
同时,也运行了为测试UDP代理的服务器端。进行测试的思路是这样,
通过(192.168.2.1:1080)和服务器进行协商,
通过后,以得到的IP和端口进行UDP的连接,
去访问目标地址,如(121.31.31.26:9050),
这个目标地址是服务器的公网IP,
进行数据的收发。但在发送消息给服务器端的时候,
服务器端会出错,
出错的信息提示如下:
“未处理的异常: System.Net.Sockets.SocketException:
一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,
或该用户用于接收数据报的缓冲器比数据报小。”现在向大家请教,
关于UDP代理应该什么写?我写过的代码如下:
------------------------------------------------
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Text;
//using UDPProxyTest.Proxy;namespace UDPProxyTest
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string Username = "username";
string Password = "password";
string str1 = ""; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接服务器
s.Connect(IPAddress.Parse("192.168.2.1"), 1080); //认证方式的协商
s.Send(new byte[] { 5, 2, 0, 2 });//
byte[] ret = new byte[2]; s.Receive(ret);
str1 = "认证方式的协商的返回值:\t";
Console.WriteLine(str1);
str1 = ret[0].ToString() + " " + ret[1].ToString();
Console.WriteLine(str1); //用户名和密码认证
if (ret[1].ToString() == "2")//如果支持用户名和密码认证,则执行IF里面的语句
{
byte[] buffer = new byte[3 + Username.Length + Password.Length];
buffer[0] = 1;
buffer[1] = (byte)Username.Length;
Array.Copy(Encoding.ASCII.GetBytes(Username), 0, buffer, 2, Username.Length);
buffer[Username.Length + 2] = (byte)Password.Length;
Array.Copy(Encoding.ASCII.GetBytes(Password), 0, buffer, Username.Length + 3, Password.Length);
s.Send(buffer);
data = new byte[1024];
s.Receive(data);
str1 = "用户名和密码认证\t" + data[1].ToString();
Console.WriteLine(str1);
} //发送具体请求
byte[] connect = new byte[10];
connect[0] = 5;//VER
connect[1] = 3;//CMD
connect[2] = 0;//RSV
connect[3] = 1;//ATYP
connect[4] = 121;//DST.ADDR
connect[5] = 31;
connect[6] = 31;
connect[7] = 26;
int port = 9050;//端口
connect[8] = (byte)(port / 256);//DST.PORT
connect[9] = (byte)(port % 256); s.Send(connect);//发消息
data = new byte[11];
s.Receive(data);
str1 = "发出具体请求的返回值:";
Console.WriteLine(str1);
str1 = data[0] + " " + data[1] + " " + data[2] + " " + data[3] + " " + data[4] + " " + data[5] + " " + data[6] + " " +
data[7] + " " + data[8] + " " + data[9];
Console.WriteLine("<{0}>", str1);
Console.WriteLine();
//发送UDP数据
Console.WriteLine("转发UDP数据包");
string udpAddress = data[4].ToString() + "." + data[5].ToString() + //udpAddress为协商得到的IP地址
"." + data[6].ToString() + "." + data[7].ToString();
byte[] bRet = new byte[10];
bRet[0] = data[9];
bRet[1] = data[8];
int nPort = BitConverter.ToInt32(bRet, 0);//nPort为协商得到的端口
Console.WriteLine("UDP连接的目标地址:{0}:{1}",udpAddress,nPort.ToString()); byte[] udpHead = new byte[11];//对要发送的UDP消息的进行构造
udpHead[0] = 0;//RSV
udpHead[1] = 0;
udpHead[2] = 0;//FRAG
udpHead[3] = 1;//ATYP
udpHead[4] = 121;//DST.ADDR
udpHead[5] = 31;
udpHead[6] = 31;
udpHead[7] = 26;
port = 9050;//DST.PORT
udpHead[8] = (byte)(port / 256);;
udpHead[9] = (byte)(port % 256);
udpHead[10] = 65;//DATA在这里,我仅发送了一个数据 IPEndPoint udpIqep = new IPEndPoint(IPAddress.Parse(udpAddress),nPort);
Socket sUDP = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//UDP套接字 int sent = sUDP.SendTo(udpHead,udpIqep);//发送数据
Console.WriteLine("发送了<{0}>字节",sent.ToString()); IPEndPoint tempIp = new IPEndPoint(IPAddress.Any,0);
EndPoint remote = (EndPoint)tempIp;
byte[] bReceive=new byte[1024];
int recv = sUDP.ReceiveFrom(bReceive,ref remote);//接收数据
Console.WriteLine("接收了<{0}>字节", recv.ToString()); //
sUDP.Close();
s.Close();
Console.WriteLine("关闭套接字!");
Console.ReadLine();
}
}
}-----------------------------------------------------------
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货