Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   А можно ли передать открытый сокет в другую программу? (http://forums.kuban.ru/f1024/mozhno_li_peredat-_otkrytyj_soket_v_druguyu_programmu-3107666.html)

Lucas 26.09.2012 12:10

А можно ли передать открытый сокет в другую программу?
 
Delphi, Builder
Собственно возник вопрос, а можно ли передать открытый сокет в другую программу?
Это для того, чтоб делать "горячуюю" смену ПО на сервере.
А то и так ошибок соединения хватает.

NTFS_ 26.09.2012 12:45

Технически, наверно, можно (если выносить в dll).
ИМХО, уровень возможных косяков от этой схемы будет выше, чем польза.
Что за приложение, которое нельзя вырубить на пару секунд? Навигатор ядрёной ракеты? :-)

Lucas 26.09.2012 14:38

1-NTFS_ > Та ни.
Просто прогнозируется частая смена сервака (ПО).
Слишком всё сырое и много развития.
А клиент глючит, при обрыве.
Пока не вылечили (найти не можем, откуда у эксцепшена ноги растут, вроде бы всё обработали).

Samael 26.09.2012 16:06

[quote=Lucas;27005175]а можно ли передать открытый сокет в другую программу?[/quote]
Ответ на поставленный вопрос - нет. Однако возможно другое проектирование. Как правильно заметил NTFS - нужно использовать общую память (см. в гугле "разделяемая память" / "shared memory") для обоих процессов, в частном случае это DLL. Это означает, что в теории возможно даже одновременное использование.
Но есть один важный момент. Я не могу сказать точно, будут ли прерваны уже установленные соединения (скорее всего нет, но вот с обработкой передаваемых данных точно могут быть проблемы). Но обработка новых подключений будет приостановлена точно. Это связано со спецификой метода "accept" библиотеки WinSock.

Я думаю, что можно спокойно развернуть альфа-сервер, где уже отработать все необходимые моменты (В ТОМ ЧИСЛЕ ВОЗМОЖНОСТЬ ПЕРЕДАЧИ КЛИЕНТАМ ИНФОРМАЦИИ О ЗАВЕРШЕНИИ РАБОТЫ СЕРВЕРА В ТЕЧЕНИИИ N ВРЕМЕНИ. Я не знаю, кто у Вас занимается непосредственным проектирование, но ему медаль нужно дать, если второй раз не подумает о реализации данного момента), а затем разок устроить клиентам полный шутдаун (предварительно предупредив об этом).

Если тестирование и доработку необходимо производить в режиме реального времени при работе с клиентами, то могу посоветовать Вам немного другую схему. Должен быть реализован полностью рабочий сервер, где методы обработки данных клиентов вынесены в отдельные библиотеки. В этом случае их можно будет заменять по мере необходимости.
Через серверное приложение - сообщаем клиентским приложениям, что сервер не будет обрабатывать N-нные операции после их последнего завершения. Сервер их отработал, отключил использованную DLL, вы ее заменили, сообщили это серверному приложению об этом, а оно уже - клиентским. Обрывов в этом случае не будет.

Samael 26.09.2012 16:21

Должен добавить одно замечание. Так как автор говорил о Delphi/Builder, то речь идет о Windows. Для Unix-систем, возможна передача дескриптора сокета другому процессу (sendmsg/recvmsg).

Lucas 26.09.2012 16:44

4-Samael >
Пасиб.
Щаз попробуем обсудить вариант.
Проблема, конечно, не критичная. Но как-то не интересно копаться в мелочах, когда есть более серьёзные проблемы.
Остановить сервер на 5-10 мин, с оповещением, конечно можно. Однако, хотелось, конечно, этого не делать.

Да и трабла там какая-то у клиента - вываливается, при обрыве. Щаз её копаем. Вроде все обработчики в курсе, что делать, если обрыв, ан нет - отваливается.
Ну да ладно... Не такое разгрызали.

Achelous 26.09.2012 16:54

Разве сокет не является чем-то вроде HANDLE?
Если это так, то для них, как и всех хэндлов Винды , будет действовать правило - хендл имеет смысл только для процесса, где он создан. Поэтому ответ - НЕЛЬЗЯ.

TVV1 26.09.2012 19:04

Лучше уж наладить клиента чтобы он от обрывов не падал. Это намного проще чем что то там мутить. Если использовать indy то там вроде это делается просто.

to6 а про это читал
[url]http://msdn.microsoft.com/en-us/library/windows/desktop/ms724251%28v=vs.85%29.aspx[/url]

Achelous 26.09.2012 20:47

7-TVV1 > Мой друх, я не только про [b]это[/b] читал, и даже (о ужас) юзал. Ты до конца читал? Там в списке возможных объектов есть сокет?
Если уж на то пошло, то ты про это читал: [b]WSADuplicateSocket[/b]?
Но автору и это может не помочь, судя по докам. Надо пробовать.

TVV1 26.09.2012 21:29

to8 Ты это не передергивай в посте 6 ты писал про handel так что не надо ля-ля.

Achelous 26.09.2012 22:52

9-TVV1 > ты не жужжи лишнего. Так можно передать сокет с помошью дубликатехандле или нет?

Achelous 26.09.2012 22:53

+10, уже совсем для демагогов - сокет передается прямо вызовом дубликатехандле, или все же сначала оным, а потом каким-нибуть способом IPC? :)

Samael 27.09.2012 00:02

Я думаю, что автор уже сделал выводы для себя, но все же добавлю.

DuplicateHandle - тут явно не в тему:
typedef PVOID HANDLE;
typedef UINT_PTR SOCKET;

WSADuplicateSocket - очень сомнительный метод для данной задачи, т.к. он может быть использован только дочерними процессами (или шагаем через внедреную либу). Кроме того, слышал о проблемах при активном QoS.

Achelous 27.09.2012 13:53

12-Samael > Не "слышал", а об этом сказано в MSDN. :)
Кстати, я так и не понял, каким образом помогло бы автору твое согласие с NTFS, в плане shared dll?

Samael 27.09.2012 22:56

[quote=Ахелой;27020630] 12-Samael > Не "слышал", а об этом сказано в MSDN. :)[/quote]
Если Вам хочется поиграться в слова, то под "слышал" в данном случае, имеется ввиду читал из разных источников. Непосредственно в msdn написано:
[em]The WSADuplicateSocket function cannot be used on a QOS-enabled socket.[/em]
Т.е. вообще не работает. Далее, можно увидеть репорт о правках, а на форумах третью информацию. В итоге однозначного ответа - нет, поэтому в моем ответе и была подобная "неопределенность".

[quote=Ахелой;27020630]Кстати, я так и не понял, каким образом помогло бы автору твое согласие с NTFS, в плане shared dll?[/quote]
Помогло или нет - не мне судить. В своем ответе я заметил, что это только один из видов общей памяти. Но, так как самый разумный - пояснил, для чего использовать DLL. Кто-то может подумать, что будет достаточно просто вынести api работы с сокетами в "обертку" и все.

Но мне казалось, что я пояснил один момент. Для данной задачи нужно искать другие методы решения. Обновление ПО в режиме нон-стоп конечно выглядит красиво, но передача одного указателя соединения, не восстановит всю структуру данных, которую использовал первичный процесс.

Achelous 28.09.2012 12:06

14-Samael > дааа, словоблудием ты умеешь страдать, чел..

Lucas 29.09.2012 00:42

Ладненько, не ругайтесь.

Решили траблу.
Научили клиента реконнектится при обрыве.
Он, правда, пока, не сразу прочухивает, но потом начинает соображать, что надо бы.
Ну, ничего, и это вылечим.

ELEA 01.10.2012 11:21

16-Lucas > сделай Alive пакеты... Быстрее "прочухивать" станет :)


Текущее время: 18:09. Часовой пояс GMT +3.