Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Пропажа русских букв в дескрипторе сокетов


Автор: Quanzi 26.12.2006, 17:01
Итак... 
С локалями разобрался, проблема все-таки раньше, в момент получения данных от сокета. Соответственно могу весь файл выложить, но он больно большой... мб вот такой кусок пойдет:

Код


/*<.0.>*/

    /* If there are new connections waiting, accept them. */
    if (FD_ISSET(mother_desc, &input_set))
      new_descriptor(mother_desc);

/*<.1.>*/

    /* Process descriptors with input pending */             /* Мысль есть, что пропадают буквы где-то в этом куске */
    for (d = descriptor_list; d; d = next_d) {
      next_d = d->next;
      if (FD_ISSET(d->descriptor, &input_set))
    if (process_input(d) < 0)
      close_socket(d);
    }

    /* Process commands we just read from process_input */
    for (d = descriptor_list; d; d = next_d) {
      next_d = d->next;
      /*
       * Not combined to retain --(d->wait) behavior. -gg 2/20/98
       * If no wait state, no subtraction.  If there is a wait
       * state then 1 is subtracted. Therefore we don't go less
       * than 0 ever and don't require an 'if' bracket. -gg 2/27/99
       */
      if (d->character) {
        GET_WAIT_STATE(d->character) -= (GET_WAIT_STATE(d->character) > 0);

        if (GET_WAIT_STATE(d->character))
          continue;
      }

      if (!get_from_q(&d->input, comm, &aliased))
        continue;

      if (d->character) {
    /* Reset the idle timer & pull char back from void if necessary */
    d->character->char_specials.timer = 0;
    if (STATE(d) == CON_PLAYING && GET_WAS_IN(d->character) != NOWHERE) {
      if (IN_ROOM(d->character) != NOWHERE)
        char_from_room(d->character);
      char_to_room(d->character, GET_WAS_IN(d->character));
      GET_WAS_IN(d->character) = NOWHERE;
      act("$n has returned.", TRUE, d->character, 0, 0, TO_ROOM);
    }
        GET_WAIT_STATE(d->character) = 1;
      }
      d->has_prompt = FALSE;
      if (d->str)/* Writing boards, mail, etc. */             /* В этот момент в str уже находяться только английские буквы */
    string_add(d, comm);
      else if (d->showstr_count) /* Reading something w/ pager */
    show_string(d, comm);
      else if (STATE(d) != CON_PLAYING) /* In menus, etc. */
    nanny(d, comm);
      else {            /* else: we're playing normally. */
    if (aliased)        /* To prevent recursive aliases. */
      d->has_prompt = TRUE;    /* To get newline before next cmd output. */
    else if (perform_alias(d, comm, sizeof(comm)))    /* Run it through aliasing system */
      get_from_q(&d->input, comm, &aliased);
    command_interpreter(d->character, comm); /* Send it to interpreter */

/*<.2.>*/


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

Автор: ptr 28.12.2006, 17:42
Ну и посмотри где у тебя русские буквы портятся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)