Получить Ip из TcpClient с помощью f # - PullRequest
1 голос
/ 05 июня 2019

Привет, у меня есть вопрос.

У меня простой сервер, который выглядит следующим образом:

let private Listener ip port =
    async {

    let listener = new TcpListener(ip, port)
    listener.Start()   

    _logger.Info(printfn "Server binded to IP: %A - Port: %i" ip port)

    while listener.Pending() = false do

        try
            let! client = listener.AcceptTcpClientAsync() |> Async.AwaitTask
            clientConnectionPool.Add(client) |> ignore 
            _logger.Info(printfn "Client connected: %O" client.Client.RemoteEndPoint)
        with
            | :? ServerListenerException as ex -> _logger.Error(printfn "Exception while starting server listener - %s" ex.Message); ()

    }  

И это хорошо работает, проблема в том, что теперь я хочу получить IP-адреса клиента, обычно в c # я бы использовал:

((IPEndPoint)entry.Client.RemoteEndPoint).Address

И я верю в F # перевести на:

let clientIp : IPAddress = (client.Client.RemoteEndPoint :> IPEndPoint).Address

Но проблема в том, что я получаю сообщение

Несоответствие ограничения типа. Тип «EndPoint» не совместим с типом «IPEndPoint»

В чем может быть проблема ??

1 Ответ

4 голосов
/ 05 июня 2019

В F # upcast и downcast - это две разные вещи.Это имеет смысл: upcast никогда не завершается неудачей, никогда не приводит к null, никогда не вызывает исключение.Даункаут может провалиться.Что, если это значение RemoteEndPoint окажется не экземпляром IPEndPoint?

. Таким образом, upcast и downcast представлены двумя разными операторами.Тот, который вы используете - :> - выскочил.Это работает, только если целевой тип является супертипом исходного типа.Что в вашем случае это не так - это то, что говорит вам ошибка.

Оператор downcast - :?>.Попробуйте это:

let clientIp : IPAddress = (client.Client.RemoteEndPoint :?> IPEndPoint).Address
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...