Страниц: [1]
  Печать  
Автор Тема: нет _IO_CONNECT  (Прочитано 3750 раз)
BrutNemo
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« : Июля 11, 2013, 04:12:34 pm »

  Доброго дня!

собственно пример из нелпа - name_attach()
Код:
# include <stdio.h>
# include <errno.h>
# include <stdlib.h>
# include <string.h>
# include <sys/dispatch.h>

# define ATTACH_POINT "myname"

/* Our real data comes after the header */
typedef struct _my_data {
    _pulse pls;
    int data;
} my_data_t;

/*** Server Side of the code ***/
void server()
{ name_attach_t *attach;  my_data_t msg;  int rcvid;

  printf("Running Server ... \n");
   /* Create a local name (/dev/name/local/...) */
  if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL)
  {
    perror("name_attach");
    return;
  }
   /* Do your MsgReceive's here now with the chid */
  while (1)
  {
    if ((rcvid = MsgReceive(attach->chid, &msg, sizeof(msg), NULL)) == -1)
    {
      perror("MsgReceive:");
      break;
    }
    if (rcvid == 0) /* Pulse received */
    {
      switch (msg.pls.code)
      {
      case _PULSE_CODE_DISCONNECT:
              /*
               * A client disconnected all its connections (called
               * name_close() for each name_open() of our name) or
               * terminated
               */
        printf("Server: _PULSE_CODE_DISCONNECT\n");
        ConnectDetach(msg.pls.scoid);
        break;
      case _PULSE_CODE_UNBLOCK:
               /*
                * REPLY blocked client wants to unblock (was hit by
                * a signal or timed out).  It's up to you if you
                * reply now or later.
                */
        printf("Server: _PULSE_CODE_UNBLOCK\n");
        break;
      default:
               /*
                * A pulse sent by one of your processes or a
                * _PULSE_CODE_COIDDEATH or _PULSE_CODE_THREADDEATH
                * from the kernel?
               */
        printf("Server: Pulse received %d\n", msg.pls.code);
        break;
      }
      continue;
    }
       /* name_open() sends a connect message, must EOK this */
    if (msg.pls.type == _IO_CONNECT )
    {
      printf("Server: _IO_CONNECT\n");
      MsgReply( rcvid, EOK, NULL, 0 );
      continue;
    }
       /* Some other QNX IO message was received; reject it */
    if (msg.pls.type > _IO_BASE && msg.pls.type <= _IO_MAX )
    {
      printf("Server: MsgError\n");
      MsgError( rcvid, ENOSYS );
      continue;
    }
       /* A message (presumable ours) received, handle */
    printf("Server receive %d \n", msg.data);
    MsgReply(rcvid, EOK, 0, 0);
  }

   /* Remove the name from the space */
  name_detach(attach, 0);
}

/*** Client Side of the code ***/
void client()
{ my_data_t msg;  int fd;

  printf("Running Client ... \n");
  if ((fd = name_open(ATTACH_POINT, 0)) == -1)
  {
    perror("name_attach");
    return;
  }
    /* We would have pre-defined data to stuff here */
  msg.pls.type = 0x00;
  msg.pls.subtype = 0x00;

    /* Do whatever work you wanted with server connection */
  for (msg.data=0; msg.data < 5; msg.data++)
  {
    printf("Client sending %d \n", msg.data);
    if (MsgSend(fd, &msg, sizeof(msg), NULL, 0) == -1)
    {
      perror("MsgSend");
      break;
    }
  }
  /* Close the connection */
  name_close(fd);
}

int main(int argc, char **argv)
{ void (*ZFu[])(void) = { server, client };  int i;

  if (argc >= 2 && ((i = !strcmp(argv[1], "-c")) || !strcmp(argv[1], "-s")))
    ZFu[i]();
  else
    printf("Usage %s -s | -c \n", argv[0]);
}

Подскажите, почему сервер не получает сообщение типа _IO_CONNECT, и должен ли его получать?
« Последнее редактирование: Июля 11, 2013, 08:12:00 pm от BrutNemo » Записан
oder
Гость
« Ответ #1 : Июля 11, 2013, 09:44:52 pm »

Для сообщений есть системные структуры, через которые с ними надо работать. A _pulse, к сожалению, для работы с сообщениями не подходит.
Записан
BrutNemo
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« Ответ #2 : Июля 12, 2013, 01:28:13 pm »

Цитировать
сервер не получает сообщение типа _IO_CONNECT
надо было gns запустить Smiley
« Последнее редактирование: Июля 12, 2013, 01:29:51 pm от BrutNemo » Записан
oder
Гость
« Ответ #3 : Июля 12, 2013, 06:53:07 pm »

Как хотите...
Записан
BrutNemo
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« Ответ #4 : Июля 15, 2013, 09:34:00 am »

Цитировать
Как хотите...
Хочется, конечно, лучшего Smiley
а в голову приходит только: union {stuct StData So; _pulse Pls;};

изначально не мого понять, почему в док-ах (name_open()) описано наличие уведомляющего сообщения, а по факту я его не видел Smiley

Цитировать
системные структуры
если Вам не сложно, не могли бы немного пояснить, или намекнуть Smiley

PS c шестым только начал знакомиться, поэтому, заранее прошу прошения за банальные вопросы Smiley
« Последнее редактирование: Июля 15, 2013, 09:50:37 am от BrutNemo » Записан
oder
Гость
« Ответ #5 : Июля 15, 2013, 01:42:59 pm »

Ну в статье по name_attach() внизу есть пример же. Там бордовым по серому написано

typedef struct _my_data {
    msg_header_t hdr;
    int data;
} my_data_t;
Записан
Страниц: [1]
  Печать  
 
Перейти в: