`
starnc
  • 浏览: 142200 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

UDP用同一端口收发数据 c#

    博客分类:
  • .NET
阅读更多

之前用UdpClient,发现当开了一个端口用于监听接收,则不能再用来发送(反之亦然)。这样对于简单的收发信息来说无问题,但如果需要nat穿透的程序,则变得困难。用Socket类则不存在该问题,参考下面示例代码:

    class Program
    {
        static void Main(string[] args)
        {
            SocketTest test = new SocketTest();
            test.StartReceive();
            Console.WriteLine("请输入对端口号,准备发送:");
            string port = Console.ReadLine();
            test.SendData(Encoding.UTF8.GetBytes("你好吗?"), IPAddress.Parse("127.0.0.1"), Convert.ToInt32(port));
            Console.ReadKey(true);
        }

        
    }

    public class SocketTest
    {
        private Socket _socket;
        IPEndPoint _local = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5238);
        Thread _receiveThread = null;


        public void StartReceive()
        {
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _receiveThread = new Thread(Receive);
            _receiveThread.Start();
        }

        public void SendData(byte[] data, IPAddress remoteIP, int remotePort)
        {
            _socket.SendTo(data, new IPEndPoint(remoteIP, remotePort));
        }

        public void Close()
        {
            if (_receiveThread != null)
                _receiveThread.Abort();
            if (_socket != null)
                _socket.Close();
        }

        private void Receive()
        {
            _socket.Bind(_local);
            Console.WriteLine("开始接收。。。");
            while (true)
            {
                byte[] buffer = new byte[1024];
                EndPoint remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
                int len = _socket.ReceiveFrom(buffer, ref remoteEP);
                IPEndPoint ipEndPoint = remoteEP as IPEndPoint;
                Console.WriteLine("收到消息:客户机IP--{0},,端口--{1}", ipEndPoint.Address.ToString(), ipEndPoint.Port.ToString());
                Console.WriteLine("消息内容:{0}", Encoding.UTF8.GetString(buffer, 0, len));
            }
        }

        
    }

转载: http://harvey8819.blog.163.com/blog/static/162365181201123121635983/

分享到:
评论

相关推荐

    C# UDP多线程发送接收

    通过多线程的方式实现了UDP收发数据 可以快速学习UDP通讯原理应进行实际应用

    C#实现udp广播收集局域网类所有设备信息

    制定udp广播的端口(如果收发用同一个端口就会一直接收到自己给自己广播的消息)2.启动后向局域网广播约定的字符串(字符串包含了广播端的IP和用来接收响应的端口号)3.设备需要内置一个功能,打开约定的接收广播...

    C#UDP通讯多编码收发一体客户端

    项目中需要接收对方发过来udp消息的功能,便网上找代码做了个测试发送接收UDP的简单小程序.填入对方接收ip和端口,就可以发送消息.本地绑定一个端口(代码里改),接收所有发送到该端口的消息.分为unicode,utf8,gb2312三...

    C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)只是一个简单的收发消息的小程序,并没有什么测试工具。

    C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)自己测试没有问题只是一个简单的收发消息的小程序,并没有什么测试工具。

    基于C#的UDP通讯接收和发送程序

    基于C#的UDP通讯测试,默认收发都是本地IP,本地端口8000,远端端口1234,打开程序后,可向本机1234端口发送数据,也可接收本地1234端口的数据。

    全面掌握VisualC_实现UDP协议(一)

    当然如果你非要进行连接,通过Visual C#也是可以实现的,但前提是要确定连接的远程主机的端口号处于监听状态,否则程序会出现不必要的错误,但这是种画蛇添足的做法,不仅丢失了UDP协议的无连接传送数据的特点和...

    C#开发经验技巧宝典

    1024 如何使用PrintDocument控件打印窗体数据 599 1025 如何使用PrintPreviewContronl控件预览 599 1026 使用PrintPreviewDialog对话框 600 1027 如何使用PrintDialog对话框打印 601 1028 如何使用...

    编程技巧(全部工程源代码,物超所值)

    软件在线升级程序的设计 软件在线升级程序的设计 用C++Builder 6.0实现远程控制 利用C#调用Microsoft.Win32命名空间中的类实现对注册表的读取管理 用C#开发手机短信收发程序 远程计算机重启原理及实现 VC++6.0...

    客服端界面.sln

    由于公司A和公司B是不同国家的公司,他们之间的商定统一用英语作为交流的语言,所以此时表示层(公司的文秘),就是将应用层的传递信息转翻译成英语。同时为了防止别的公司看到,公司A的人也会对这份报价单做一些...

Global site tag (gtag.js) - Google Analytics