Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача дескриптора сокета  (Прочитано 8945 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MGF
Гость
« : 04-11-2003 21:42 » 

Люди помогите!!!
Как передать дескриптор сокета между процесами? т.е я форкаюсь после вызова функции accept создается дочерний процес.

Мне нужно передать дескриптор сокета от одного дочернего процеса другому. Пока не где не нашол как это сделать , может ссылочку какуюнибуть дадите ? или тут ответите .
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 04-11-2003 21:56 » 

MGF, тебе ничего не надо передовать это не иметт смысла дочерний процес наследует все дискрипторы. Вот пример выдран из рабочей проги:
Код:
/* Бесконечный цикл обработки запросов. */
  while (1){
    struct sockaddr_in remote_address;
    socklen_t address_length;
    int connection;
    pid_t child_pid;

    /* Прием запроса. Эта функция блокируется до тех пор, пока
       не поступит запрос. */
    address_length = sizeof (remote_address);
    connection = accept(server_socket, &remote_address,
                                        &address_length);
    if (connection == -1){
      /* Функция завершилась неудачно. */
      if (errno==EINTR)
        /* Функция была прервана сигналом. Повторная попытка. */
        continue;
      else
        /* Что-то случилось. */
        system_error("accept");
    }

    /* Соединение установленно. Вывод сообщения, если сервер
       работает в режиме развёрнутых сообщений. */
    if (verbose) {
      socklen_t address_length;

      /* Получение адресса клиента. */
      address_length = sizeof(socket_address);
      rval = getpeername (connection, &socket_address,
                                    &address_length);
      assert (rval == 0);
      /* Вывод сообщения. */
      printf("connection accepted from %s\n",
            inet_ntoa (socket_address.sin_addr));
    }

    /* Создание дочерниго процесса для обработки запроса. */
    child_pid = fork();
    if (child_pid == 0){
      /* Это дочерний процесс. Потоки stdin и stdout ему не нужны,
         поэтому закрываем их. */
      close(STDIN_FILENO);
      close(STDOUT_FILENO);
      /* Дочерний процесс не должен работать с серверным сокетом,
         поэтому закрываем его дескриптор. */
      close(server_socket);
      /* Обработка запроса. */
      handle_connection(connection);
      /* Обработка завершена. Закрываем соединение и завершаем
         дочерний процесс. */
      close(connection);
      exit(0);
    }
    else if (child_pid > 0){
      /* Это родительский процесс. Дескриптор клиентского сокета
         ему не нужен. Переход к приёму следующего запроса. */
      close(connection);
    }
    else
      /* Выхов fork() завершился неудачей. */
      system_error("fork");
  }
« Последнее редактирование: 20-11-2007 18:21 от Алексей1153++ » Записан

Странно всё это....
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 04-11-2003 21:56 » 

Перенесена в сети ибо по сокетам работа относится к сетям....
Правда передача дескриптора не совем, но ИМХО здесь поточнее ее место.MGF, Магвадан - это что за город такой ?
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 04-11-2003 22:04 » 

Гром, это даже наверно никсы. Форки бродят всётаки! Ага
Записан

Странно всё это....
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #4 : 05-11-2003 00:25 » 

fork это название функции...
На всамом деле разница между никсом и виндой в том, что форк может создавать и создает, если я ничего не путаю - копию родительского процесса, таким образом связывая его с родителем, а винда создает связки объектов...
Хотя это офтопик и это можно обсудить в другой теме...

И ты уверен что ф никсах процесс наследует все дескрипторы???
В винде вот тут я писал о наследовании процессом дескриптора объекта ядра: https://club.shelek.ru/viewart.php?id=86
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 05-11-2003 10:50 » 

Наследует - это же полная копия родительского.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Anonymous
Гость
« Ответ #6 : 16-11-2003 15:23 » 

Цитата: RXL
Наследует - это же полная копия родительского.

А если быть точным то он их дупит. Делает им dup. Поэтому можно закрывать один хендлеров - или в папе или в сыне не закрывая полностью сокет.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines