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