下面是一个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();
        }
    }
}-----------------------------------------------------------