在Socket编程中,用Sendto()发送UDP数据包时,只需创建一个套节字,并且指定目标主机的IP和端口号,不用把自己的IP和端口bind()到套节字,因此发送的端口是系统随机分配的,但我想用固定端口发送UDP包怎么办?如:从本机端口4001发送数据到远程终端(IPEndPoint)

解决方案 »

  1.   

    UDP客户端的Socket也可以Bind, 不信你试试
      

  2.   

    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 4001);
                        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                        socket.Bind(iep);socket.SendTo(.....100%可行, 你得试一下IPAddress.Any有没有问题(或者得指定IP)
      

  3.   


    internal class UDPClient
        {
            /// <summary>
            /// 本地绑定端口
            /// </summary>
            private int UdpBindPort;        private UdpClient Client;
            /// <summary>
            /// 远程通信点
            /// </summary>
            private IPEndPoint Point = new IPEndPoint(IPAddress.Parse("192.168.1.1"), 10000);
            
            private bool m_IsInit = false;        /// <summary>
            /// 是否初始化
            /// </summary>
            public bool IsInit
            {
                get { return m_IsInit; }
            }        /// <summary>
            /// 初始化通信模块
            /// </summary>
           /// <param name="IP">IP地址</param>
           /// <param name="BindPort">本地绑定端口</param>
           /// <param name="RemotePort">远程端口</param>
            public void Init(string IP, int BindPort, int RemotePort)
            {
               
                Point.Address = IPAddress.Parse(IP);            Point.Port = RemotePort;            UdpBindPort = BindPort;            byte[] SendArr = ASCIIEncoding.ASCII.GetBytes(string.Format("init {0}", m_            m_IsInit = true
            }        /// <summary>
            /// 发送数据
            /// </summary>
            /// <param name="Port">端口</param>
            /// <param name="vData">发送的二进制数据</param>
             /// <returns></returns>
            private bool SendData(int Port,  Byte[] vData)
            {            try
                {
                    Client = new UdpClient(Port);
                    Client.Connect(Point);
                }
                catch(Exception ex) {
                    Console.WriteLine(ex.Message);     
                    return false; 
                }            Client.Send(vData, vData.Length);            Client.Close();
                return true;
            }        /// <summary>
            /// 发送数据
             /// </summary>
            /// <param name="vData">发送的二进制数据</param>
            /// <returns></returns>
            public bool SendData(byte[] vData)
            {
                if (!m_IsInit) return false;
                return SendData(UdpBindPort, vData);
            }
        }