Класс демона UDP: предпринятая операция не поддерживается для типа объекта, на который ссылается

#c# #sockets

#c# #сокеты

Вопрос:

Я создаю класс демона UDP в C #, после установки точки останова в Visual Studio я вижу «Предпринятая операция не поддерживается для типа объекта, на который ссылается». внутри this::ip::Address::ScopeId::base . ScopeId выдает исключение System.Net.Sockets.SocketException . Код ошибки 10045 / OperationNotSupported.

Вызывающий код:

 namespace Foo.Tester
{
    class Program
    {
        static void Main(string[] args)
        {
            var TestDaemon = new UDPDaemon();
            TestDaemon.port = 9999;
            TestDaemon.Start();
            ...
  

Класс UDPDaemon:

 {
    public class UDPDaemon
    {

        public int receivedDataLength; 
        public byte[] data; 
        public IPEndPoint ip; 
        public Socket socket; 
        public IPEndPoint sender;
        public EndPoint Remote; 
        public string raw;
        public int port { get; set; }
        public LogRow row;


        public UDPDaemon() 
        {
            ip = new IPEndPoint(IPAddress.Any, port);
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            sender = new IPEndPoint(IPAddress.Any, 0);
            Remote = (EndPoint)(sender);
        }
        public void Start()
        {
            socket.Bind(ip);
            while (true)
            {
                data = new byte[1024];
                receivedDataLength = socket.ReceiveFrom(data, ref Remote);
                raw = Encoding.ASCII.GetString(data, 0, receivedDataLength);
                row = new LogRow(raw);
                //Will eventually move to Queue, but just print it for now
                Console.WriteLine(row.ClientIp);
            }
        }
    }
}
  
  1. Что вызывает это исключение и что означает исключение?
  2. Почему я вижу исключение, только если я устанавливаю точку останова в VS?
  3. Я только начал изучать этот язык, поэтому, если что-то еще кажется неправильным в коде, было бы полезно знать.

Комментарии:

1. Порт не задан в ip = new IPEndPoint(IPAddress.Any, port); , и это вызывает исключения сокета, так что это своего рода базовая концепция C # OO, которую я упускаю …

2. Ах, теперь я вижу, ip назначается во время создания экземпляра объекта, а порт не назначается до тех пор, пока это не произойдет.

Ответ №1:

Поскольку вы хотите использовать port внутри конструктора, вам нужно передать его в качестве аргумента конструктора, а не устанавливать его позже, например:

 public class UDPDaemon
{
    public int receivedDataLength; 
    public byte[] data; 
    public IPEndPoint ip; 
    public Socket socket; 
    public IPEndPoint sender;
    public EndPoint Remote; 
    public string raw;
    public int Port { get; private set; }
    public LogRow row;

    public UDPDaemon(int port) 
    {
        Port = port;
        ip = new IPEndPoint(IPAddress.Any, port);
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sender = new IPEndPoint(IPAddress.Any, 0);
        Remote = (EndPoint)(sender);
    }
 ....