Как получить IP-адрес из принимающего пакета CoAP в C #? - PullRequest
0 голосов
/ 08 октября 2018

В C # я пытаюсь получить IP-адрес клиента CoAP.Это вообще возможно?Я попытался найти получаемый объект обмена, но не могу найти IP-адрес.

Клиент

    class Program
{
    private static string _port = "5683";

    static void Main(string[] args)
    {
        Request request = new Request(Method.GET);

        Uri uri = new Uri("coap://127.0.0.1:" + _port + "/" + "Test");
        request.URI = uri;
        byte[] payload = Encoding.ASCII.GetBytes("test");
        request.Payload = payload;
        request.Send();

        // wait for one response
        Response response = request.WaitForResponse();
        Debug.WriteLine(response);
    }
}

Сервер

        public Task<string> OpenAsync(CancellationToken cancellationToken)
    {
        try
        {
            _server = new CoapServer(_port);
            _server.Add(new MessageResource(_path);
            _server.Start();

        } catch (Exception ex)
        {
            throw;
        }
    }

Ресурс сообщения (используется для сервера)

 public class MessageResource : CoAP.Server.Resources.Resource
{
    public MessageResource(string path) : base(path)
    {
    }
    protected async override void DoGet(CoapExchange exchange)
    {
        try
        {
            var payload = exchange.Request.Payload;
            if (payload != null)
            {
                exchange.Respond(payloadString);
            } else
            {
                throw new Exception("Payload is null. No actor has been made.");
            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

Как видите, я хотел бы получить IP-адресклиент, который отправил сообщение.Я попытался проверить все свойства объекта обмена, но не могу найти IP-адрес, который могу использовать.

1 Ответ

0 голосов
/ 08 октября 2018

Очевидно, IP-адрес находится в exchange.Request.Source.ToString ().Если вы отправляете пакет из localhost вместо 127.0.0.1, он просто скажет localhost и затруднит его поиск.

"Uri uri = new Uri("coap://localhost:" + _port + "/" + "Test");"

РЕДАКТИРОВАТЬ: Кроме того, возможно, для будущих людей, которые нуждаются в этом: если вам нужнаТолько IP-адрес или порт, не разделяйте exchange.Request.Source.Visual autoparses exchange.Request.Source to Endpoint.Это должна быть IPEndpoint вместо конечной точки, потому что она теряет свойства «Адрес» и «Порт», если она является конечной точкой.Вы можете исправить это так:

        if (exchange.Request.Source is IPEndPoint p)
        {
            //p.Address
            //p.Port
        }
        else
        {
            //Handle errors here
        }
...