【问题标题】:C# simple UDP communicationC#简单的UDP通信
【发布时间】:2015-10-08 21:35:13
【问题描述】:

我正在学习如何使用UDP 与同一台机器上的其他应用程序进行通信,所以我正在通过下面的程序来学习概念,但是当我运行它时,我收到一条错误消息,说:

System.dll 中出现“System.Net.Sockets.SocketException”类型的未处理异常

我错过了什么或做错了什么?有人也可以简单地向我解释一下如果程序运行会发生什么?谢谢

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;


namespace udpClient
{
    public class Program
    {
        public static void Main(string[] args)
        {
            byte[] data = new byte[1024];
            string input, stringData;

            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            string welcome = "Hello, are you there?";
            data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, ipep);

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sender;

            data = new byte[1024];
            int recv = server.ReceiveFrom(data, ref Remote);

            Console.WriteLine("Message received from {0}:", Remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

            // In Unity3D, replace this with update or coroutine.
            while (true)
            {
                input = Console.ReadLine();

                if (input == "exit")
                    break;

                server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
                data = new byte[1024];
                recv = server.ReceiveFrom(data, ref Remote);
                stringData = Encoding.ASCII.GetString(data, 0, recv);
                Console.WriteLine(stringData);
            }

            Console.WriteLine("Stopping client ..");
            server.Close();

            // Console.WriteLine("\nPress any key ...");
            // Console.ReadKey();
        }
    }
}

【问题讨论】:

  • 完整的错误信息是什么?它出现在哪一行?
  • @Rahul 该示例是导致此异常的 许多 原因之一。 OP 需要检查他们的 InnerException。
  • @Alex K.对不起,我应该在哪一行说...int recv = server.ReceiveFrom(data, ref Remote);
  • 服务器需要先启动。这是客户端代码。你确定这段代码真的有效吗?该代码是从端口零(IPAddress.Any,0)接收的,我认为这不起作用。需要将零更改为真实的端口号。

标签: c# network-programming udp


【解决方案1】:

查看此代码的快速修复,请注意此结构仅用于演示,不适用于生产。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace testUDP
{
class Program
{

    static volatile Boolean receivingThreadStarted = false;

    public static void DoReceiveFrom()
    {
        byte[] data = new byte[1024];
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 9050);
        EndPoint Remote = (EndPoint)sender;
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        server.Bind(sender);
        receivingThreadStarted = true;
        int recv = server.ReceiveFrom(data, ref Remote);
        Console.WriteLine("Message received from {0}:", Remote.ToString());
        Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
    }


    static void Main(string[] args)
    {
         byte[] data = new byte[1024];
        string input;

        IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        ThreadStart threadDelegate = new ThreadStart(DoReceiveFrom);
        Thread newThread = new Thread(threadDelegate);
        newThread.Start();

        // Waiting to start the receiving thread.
        while (!receivingThreadStarted) Thread.Sleep(100);

        string welcome = "Hello, are you there?";
        data = Encoding.ASCII.GetBytes(welcome);
        server.SendTo(data, data.Length, SocketFlags.None, ipep);

        while (true)
        {
            input = Console.ReadLine();

            if (input == "exit")
                break;               
        }

        Console.WriteLine("Stopping client ..");
        server.Close();

    }
}

}

【讨论】:

  • 非常感谢...它就像一个魅力!我将研究代码以进一步了解它。如果我需要澄清,将再次发表评论。干杯
  • 嗨哈森,你能详细说明IPAddress.Any, 9050吗?这是否意味着它可以在任何机器上工作(即任何 IP 地址)并且它是通过端口 9050(控制台端口?)发送的?另外,当我运行程序时,"Message received from {0}:", remote.ToString() 部分显示127.0.0.1:65226——这又是一个端口号吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
相关资源
最近更新 更多