Чудеса (возможно с Indy)

Модератор: Модераторы

Чудеса (возможно с Indy)

Сообщение Brainenjii » 20.08.2008 17:35:05

В общем, не знаю даже как и объяснить... Пишу клиент-серверное приложение, пользую Indy10... Обмениваются клиент и сервер Record'ами:
Код: Выделить всё
Type BSysMessage = Packed Record
  TypeOfMessage: Integer;
  Addiction: Integer;
  Extension: Integer;
End;

Type BTypeRecord = Packed Record
  ID: Integer;
  Caption: Array[0..1000] Of Char;
  TimeStart: TDateTime;
  TimeFinish: TDateTime;
  Rating: SmallInt;
  Status: SmallInt;
  Source: Integer;
  TimeSuspend: TDateTime;
  Comment: Array[0..1000] Of Char;
End;

Type BTypeEvent = Packed Record
  ID: Integer;
  Caption: Array[0..1000] Of Char;
  EventDate: TDateTime;
  EventType: SmallInt;
  Status: SmallInt;
  Rating: SmallInt;
  OptionRemind: Integer;
  OptionReference: Integer;
  OptionPopup: Boolean;
  TimeSuspend: TDateTime;
End;

Type BTypeReglament = Packed Record
  ID: Integer;
  Caption: Array[0..1000] Of Char;
  Status: SmallInt;
  RepeatType: SmallInt;
  Frequency: SmallInt;
  Option: Integer;
  Color: Integer;
  EndDate: TDateTime;
  TimeStart: TDateTime;
  TimeFinish: TDateTime;
End;

Type BTypeUser = Packed Record
  ID: Integer;
  Caption: Array[0..1000] Of Char;
  UserPass: Array[0..1000] Of Char;
  GroupsCount: Integer;
  SlavesCount: Integer;
  AllowWinLogin: Boolean;
End;

Type BTypeGroup = Packed Record
  ID: Integer;
  Caption: Array[0..1000] Of Char;
  UsersCount: Integer;
End;

Обмениваются так:
Код: Выделить всё
Procedure BClient.SysSend(Const ASysMessage: BSysMessage);
Begin
  Socket.Write(RawToBytes(aSysMessage, SizeOf(ASysMessage)));
  Log('Send: ' + IntToStr(ASysMessage.TypeOfMessage) + ':' +
    IntToStr(ASysMessage.Addiction) + ':' + IntToStr(ASysMessage.Extension));
End;

Procedure BClient.EventSend(Const aEvent: BTypeEvent);
Begin
  Socket.Write(RawToBytes(aEvent, SizeOf(BTypeEvent)));
End;

Procedure BClient.ReglamentSend(Const aReglament: BTypeReglament);
Begin
  Socket.Write(RawToBytes(aReglament, SizeOf(BTypeReglament)));
End;

Procedure BClient.UserSend(Const aUser: BTypeUser);
Begin
  Socket.Write(RawToBytes(aUser, SizeOf(BTypeUser)));
End;

Procedure BClient.GroupSend(Const aGroup: BTypeGroup);
Begin
  Socket.Write(RawToBytes(aGroup, SizeOf(BTypeGroup)));
End;

Procedure BClient.RawSend(Const aRecord: BTypeRecord);
Begin
  Socket.Write(RawToBytes(aRecord, SizeOf(BTypeRecord)));
End;

Function BClient.RawGet: BTypeRecord;
Var
  ReceiveStream: TIdBytes;
Begin
  Socket.ReadBytes(ReceiveStream, SizeOf(BTypeRecord));
  Move(ReceiveStream[0], Result, SizeOf(BTypeRecord));
End;

Function BClient.SysGet: BSysMessage;
Var
  ReceiveStream: TIdBytes;
Begin
  Socket.ReadBytes(ReceiveStream, SizeOf(BSysMessage));
  Move(ReceiveStream[0], Result, SizeOf(BSysMessage));
  Log('Get: ' + IntToStr(Result.TypeOfMessage) + ':' +
    IntToStr(Result.Addiction) + ':' + IntToStr(Result.Extension));
End;

Function BClient.EventGet: BTypeEvent;
Var
  ReceiveStream: TIdBytes;
Begin
  Socket.ReadBytes(ReceiveStream, SizeOf(BTypeEvent));
  Move(ReceiveStream[0], Result, SizeOf(BTypeEvent));
End;

Function BClient.ReglamentGet: BTypeReglament;
Var
  ReceiveStream: TIdBytes;
Begin
  Socket.ReadBytes(ReceiveStream, SizeOf(BTypeReglament));
  Move(ReceiveStream[0], Result, SizeOf(BTypeReglament));
End;

Function BClient.UserGet: BTypeUser;
Var
  ReceiveStream: TIdBytes;
Begin
  Socket.ReadBytes(ReceiveStream, SizeOf(BTypeUser));
  Move(ReceiveStream[0], Result, SizeOf(BTypeUser));
End;

Function BClient.GroupGet: BTypeGroup;
Var
  ReceiveStream: TIdBytes;
Begin
  Socket.ReadBytes(ReceiveStream, SizeOf(BTypeGroup));
  Move(ReceiveStream[0], Result, SizeOf(BTypeGroup));
End;

На сервере тоже самое... Log - это
Код: Выделить всё
Procedure Log(Const aString: String);
Begin
  If Debug Then WriteLn(aString);
End;

Вот... Если Debug = TRUE и в настройках компилятора убрано, что это графическое приложение и для gdb инфа генерируется - всё работает идеально... И если сервер и клиент на одной ОС (win-win, lin-lin) - тоже... Но если Debug = FALSE и без ключа -WG компилировать и сервер - на линуксе, а клиент - на Windows - то в некоторых ситуациях всесто отправляемой инфы (на сервере всегда выводится) - на клиент приходит туча нулей (проверяю через ShowMessage) и, собственно, ничего не работает дальше как надо ^_^ В общем, в чём может быть проблема? Хотя, наверное, непонятно объяснил >_<
Раньше такая же ситуация была постоянно (когда записи были просто Record, а не Packed Record, как сейчас) - знакомый предположил что из-за разного выравнивания в лин/вин. Поменял все Record'ы на сервере и клиенте - заработало (в "дебажном" варианте)... Теперь, когда осталось 2 дня до сдачи - попробовал собрать "релизный" - и опять 25 >_< Буду рад любым советам ^_^ (кроме как отказываться от Indy - она мне очень нравится, да и некогда переписывать...)

UPD: сейчас подумал, что возможно проблема в том, что на винде 2.2.2 компилятор, а в линуксе 2.2.2rc1

Добавлено спустя 14 часов 46 минут 20 секунд:
Чудес не бывает T_T Просто в одном месте делаю тупо WriteLn... И проблема в другом совсем оказалась ^_^

Добавлено спустя 34 минуты 38 секунд:
Не, всё-таки бывают ^_^ Проблема всё-таки оказалось в разных компиляторах (надеюсь)... Пересобрал сервер и клиент 2.2.2 - всё заработало с любыми ключами ^_^ Колдунство...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Чудеса (возможно с Indy)

Сообщение Verx0Laz » 02.08.2009 15:08:42

Прочитав книженцию про индюк, начал кодить. Наткнувшись на пару колдунств, подумал, что это я где-то туплю. Оказалось - нет. Поиск по гуглю внятно показывает, что чем глубже влезаем в Indy - тем больше нужен бубен. В итоге большинство народа либо начинает переписывать модули индюка под себя, либо переходит на синапс. Имхо, переписывать индюк - это каша из топора и тришкин кафтан в одном флаконе. Вернее уж тогда с нуля собственную компоненту писать.
Есть у кого - нибудь иное мнение по этому вопросу?
Аватара пользователя
Verx0Laz
постоялец
 
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Re: Чудеса (возможно с Indy)

Сообщение Logo » 03.08.2009 12:47:50

Verx0Laz писал(а):...
Есть у кого - нибудь иное мнение по этому вопросу?

Пока нет, но придется пробовать. Сначала хочу, все-таки, пересмотреть Инди.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47


Вернуться в Сети

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru