Сокеты и постоянство данных - PullRequest
1 голос
/ 01 августа 2009

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

Спасибо

Н.

Дополнительная информация:

Я пытаюсь переписать 2 программы, которые используют файлы в качестве интерфейса для связи. Общий поток:

Основной процесс: запись данных.

Основной процесс: порождение вторичного процесса (ов) на другие узлы в кластере

Основной процесс: дождитесь завершения вторичного процесса.

Вторичный процесс: чтение данных (записано основным)

Вторичный процесс: запись данных

Вторичный процесс: выход

Основной процесс: чтение данных.

Поэтому я хочу заменить запись / чтение / запись / чтение файлов сокетами (что должно быть намного быстрее!)

Ответы [ 2 ]

5 голосов
/ 01 августа 2009

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

Для UDP, если никто не прослушивает сокет во время отправки данных, никто не получит его, если вам не удастся открыть программу прослушивания достаточно быстро, чтобы данные по-прежнему передавались внутри сетевых драйверов. Но не рассчитывайте на это, потому что «петля localhost» внутри драйвера не должна занимать более нескольких микросекунд для доставки данных.

P.S. Возможно, вы сможете получить более подходящий ответ, если опишете свою точную ситуацию более подробно. Чего ты пытаешься достичь?


Относительно вашей "дополнительной информации". Вы не можете сделать это с сокетами, просто заменив файлы сокетами и сохранив текущую схему. Однако вы можете попытаться изменить схему, сначала порождая дочерние процессы, а затем отправляйте им данные через сокеты. Когда дети заканчивают, они возвращают ответ родителю через сокет и выходят.

Здесь в некотором смысле есть неэффективность, потому что вы должны отправлять одни и те же данные каждому ребенку отдельно (если вы не можете использовать многоадресную передачу).

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

3 голосов
/ 01 августа 2009

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

Если вы хотите иметь асинхронную доставку, вам нужно использовать систему передачи сообщений, которая разрешает отложенную доставку. В этом случае получатель сообщения на самом деле является системным процессом, который сохраняет сообщение до тех пор, пока клиент не запросит его. Фактическая связь происходит между клиентом в одной системе и системным процессом в другой, а клиент в другой системе получает данные локально. Вы можете узнать больше о передаче сообщений и ее вариантах на http://en.wikipedia.org/wiki/Message_passing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...