#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);
}
}
}
}
- Что вызывает это исключение и что означает исключение?
- Почему я вижу исключение, только если я устанавливаю точку останова в VS?
- Я только начал изучать этот язык, поэтому, если что-то еще кажется неправильным в коде, было бы полезно знать.
Комментарии:
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);
}
....