Приведение типов и фабричный шаблон

Мне трудно понять, как реализовать фабричный шаблон в DTO-картографе, который я пытаюсь создать. Я уверен, что мне нужно переосмыслить свой дизайн. Вот очень маленький пример того, к чему я прибегаю:

    public abstract class Person
{
    public string Name { get; set; }
    public decimal Salary { get; set; }
}

public class Employee : Person
{
    public Employee()
    {
        this.Salary = 20000;
    }

}

public class Pilot : Person
{
    public string PilotNumber { get; set; }

    public Pilot()
    {
        this.Salary = 50000;
    }
}

public static class PersonFactory
{
    public static Person CreatePerson(string typeOfPerson)
    {
        switch (typeOfPerson)
        {
            case "Employee":
                return new Employee();
            case "Pilot":
                return new Pilot();
            default:
                return new Employee();
        }
    }
}

и использование фабрики:

Person thePilot = PersonFactory.CreatePerson("Pilot");
        ((Pilot)thePilot).PilotNumber = "123ABC";

Как мне обойти загрузку номера пилота, не вводя его в Pilot ?? это неправильный способ сделать это? Я мог бы поместить номер пилота в класс Person, но тогда Employee унаследовал бы номер, а это не то, что я хочу. Я использую их для отправки обновлений данных с сервера на клиент и наоборот. Я отправляю обновления с высокой частотой (каждые 100 мс). Будет ли функция send () ...

Я использую блокирующие сокеты C в Windows. Я использую их для отправки обновлений данных с сервера на клиент и наоборот. Я отправляю обновления с высокой частотой (каждые 100 мс). Будет ли функция send () ждать, пока получатель recv () получит данные, прежде чем закончить?

Полагаю, нет, если я хорошо понимаю страницу руководства:

«Успешное завершение send () не гарантирует доставку сообщения».

Так что же произойдет, если один из них запускает 10 send () , в то время как другой завершил только 1 recv ( ) ?

Нужно ли мне использовать какую-либо систему подтверждения?

8
задан laxonline 21 January 2013 в 06:38
поделиться

4 ответа

Предположим, вы используете TCP. Когда вы вызываете send, данные, которые вы отправляете, немедленно помещаются в исходящую очередь, после чего отправка завершается успешно. Однако, если send не может поместить данные в исходящую очередь, send возвратится с ошибкой.

Поскольку Tcp является протоколом гарантированной доставки, данные в исходящей очереди могут быть удалены только после получения подтверждения удаленным концом. Это связано с тем, что может потребоваться повторная отправка данных, если подтверждение не было получено вовремя.

Если удаленный конец работает медленно, исходящая очередь заполняется данными, и отправка затем блокируется до тех пор, пока не появится место для размещения новых данных в исходящей очереди.

Однако соединение может быть прервано таким образом, что никакие дальнейшие данные не будут отправлены. Хотя после того, как соединение TCP было закрыто, любые дальнейшие отправки приведут к ошибке, пользователь не имеет возможности узнать, сколько данных действительно было передано другой стороне. (Я не знаю способа получить учетные записи TCP из сокета в пользовательское приложение). Поэтому, если требуется подтверждение получения данных, вам, вероятно, следует реализовать это на уровне приложения.

Для UDP, я думаю, само собой разумеется, что некоторый способ сообщения о том, что было или не было получено, является обязательным.

11
ответ дан 5 December 2019 в 07:56
поделиться

send() блокируется до тех пор, пока операционная система (ядро) не возьмет данные и не поместит их в буфер исходящих данных. Он не ждет, пока другой конец получит данные.

8
ответ дан 5 December 2019 в 07:56
поделиться

Если вы используете TCP, вы получаете подтверждения бесплатно, так как это часть работы протокола. Но похоже, что для этого типа приложений вы, вероятно, захотите использовать UDP. В любом случае send() не будет блокироваться, пока клиент не успешно recv().

Если важно, чтобы клиент получал каждое сообщение, используйте TCP. Если клиент может пропустить одно или несколько сообщений, используйте UDP.

0
ответ дан 5 December 2019 в 07:56
поделиться

Если вы отправляете по TCP, вы получаете гарантированную доставку1, а другой конец получит данные в порядке отправки. Однако это может быть объединено, чтобы то, что вы отправили в виде 10 отдельных обновлений, могло быть получено как один большой пакет (или наоборот — одно обновление могло быть разбито на произвольное количество пакетов). Это означает, среди прочего, что любой ACK любых данных неявно подтверждает получение всех предыдущих данных.

Если вы используете UDP, все это не так — данные могут поступать не по порядку или быть отброшены и вообще не доставлены. Если вы заботитесь обо всех получаемых данных, вам просто необходимо создать какую-то собственную систему подтверждения поверх самого UDP.

1 Конечно, есть ограничение на гарантию — если сетевой кабель обрывается (или что-то еще), пакеты не будут доставлены, но вы, по крайней мере, получите сообщение об ошибке, говорящее вам, что соединение был потерян.

2
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: