- Код: Выделить всё
- 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 - всё заработало с любыми ключами ^_^ Колдунство...




