Текущий архив: 2007.11.18;
Скачать: CL | DM;
Вниз
Тестирование программного обеспечения Найти похожие ветки
← →
31512 (2007-10-16 09:59) [40]
> Сергей М. © (16.10.07 09:48) [39]
Погоди. Во-первых Buffer - промежуточное явление.
Из него я копирую только то, что мне нужно (не весь массив) в PBuffer.
Len всегда нужная, полная длина пакета комманды. Под PBuffer всегда выделяется столько, сколько нужно. Обращаю внимание: по-хорошему нужно переписать эту часть заново. Но на это нет времени.
Скорее всего я просто не понимаю, что ты хочешь мне сказать. Разве внесённые изменения не обеспечивают передачу только того, что нужно?
← →
31512 (2007-10-16 10:06) [41]
> Сергей М. © (16.10.07 09:48) [39]
С пересылкой комманд проблем нет. Проблемы с приёмом.
← →
Сергей М. © (2007-10-16 10:35) [42]
> С пересылкой комманд проблем нет
Рано или поздно будут, обещаю.
← →
31512 (2007-10-16 10:48) [43]
> Сергей М. © (16.10.07 10:35) [42]
Странно. Я не вижу проблемы.
bmBlocking
The socket is set to blocking mode. That is, the socket must initiate reading or writing over the connection and the reading or writing occurs synchronously (execution does not continue until the reading or writing is complete).
Сокеты на клиенте блокирующие. Без вариантов. Насколько я могу судить из справки операции чтения и записи синхронны, т.е. до тех пор, пока любая из них не завершится дальнейшее не выполняется. Т.е., если я передал на запись в сокет содержимое PBuffer, пока всё это туда не запишется ничего далее выполняться не будет. Где проблема? Не понимаю.
← →
31512 (2007-10-16 10:52) [44]PBuffer всегда нужной длины... Ни битом больше ни битом меньше.
← →
Сергей М. © (2007-10-16 10:52) [45]
> Сокеты на клиенте блокирующие
Ну наконец-то разродился)
Какого лешего ты на протяжении 43-х (!) постов морочишь голову, если начиная с [11] я веду речь о неблокирующем режиме ?
← →
Сергей М. © (2007-10-16 11:15) [46]
> 31512 (16.10.07 10:06) [41]
> Проблемы с приёмом.
Для разрешения этих "проблем" необходимо изменение существующей структуры TAnswer, что естественно влечет за собой изменение прикл.протокола инф.обмена.
Ну а раз менять ты ничего не хочешь, значит проблема нерешаема.
← →
Сергей М. © (2007-10-16 11:31) [47]Вот такими должны быть твои структуры:
TCommandHeader = packed record
Code: Byte;
NameLength: Byte;
DataLength: Word;
end;
TCommand = packed record
Header: TCommandHeader;
Data: packed record end;
end;
TAnswerHeader = packed record
ErrorCode: Byte;
DataLength: Word;
end;
TAnswer = packed record
Header: TAnswerHeader;
Data: packed record end;
end;
← →
Сергей М. © (2007-10-16 11:55) [48]
function TConnection.SendCommand(Command: TCommand; ...) : TAnswer;
begin
...
ClientSocket.SendBuf(Command, SizeOf(Command) + Command.DataLength);
Result := GetAnswer(Command);
...
end;
function TConnection.GetAnswer(const Command : TCommand): TAnswer;
var
BytesNeed, BytesReceived : Integer;
Buf: PByte;
begin
..
//чтение заголовка ответа
BytesNeed := SizeOf(Result.Header);
Buf := @Result.Header;
while BytesNeed > 0 do
begin
BytesReceived := FClientSocket.ReceiveBuf(Buf^, BytesNeed);
if BytesReceived > 0 then
begin
Inc(Cardinal(Buf), BytesReceived);
Dec(BytesNeed, BytesReceived);
end else begin
.. обнаружен разрыв связи ...
end;
end;
CheckForError(Result.ErrorCode, Command); //геренация соотв.исключения, если ErrorCode <> 0
//чтение собственно данных ответа
BytesNeed := Result.Header.DataLength);
Buf := @Result.Data;
while BytesNeed > 0 do
begin
BytesReceived := FClientSocket.ReceiveBuf(Buf^, BytesNeed);
if BytesReceived > 0 then
begin
Inc(Cardinal(Buf), BytesReceived);
Dec(BytesNeed, BytesReceived);
end else begin
.. обнаружен разрыв связи ...
end;
end;
...
end;
Вот и все ! И никаких TByteArray !
← →
Сергей М. © (2007-10-16 12:16) [49]Комментарий:
В отправляемой структуре TCommand размером DataLength первые NameLength байт по адресу Data должны в этом случае содержать значение Name, т.е. в правильно сформированной структуре должно соблюбаться условие DataLength >= NameLength.
← →
31512 (2007-10-16 13:14) [50]Большое спасибо за помощь! Во-первых достаточно было просто спросить меня о типе используемых сокетов. Ну лопух я пока в сетях. Имя комманды не передаётся на сервер. Оно служит для корректного отображения в логах. Так что, информация твоя с небольшой корректировкой очень ценна. Спасибо. Просто принятые данные потом должны быть преобразованы в другие типы. Ничего особенного менять и не придётся. Но вот
while BytesNeed > 0 do
очень важно. Я ходил около этого долго, но никак не мог понять будет ли это работать. Ещё раз благодарю за помощь.
← →
Сергей М. © (2007-10-16 13:22) [51]
> достаточно было просто спросить меня о типе используемых
> сокетов
Достаточно было внимательно прочитать [11])
Страницы: 1 2 вся ветка
Текущий архив: 2007.11.18;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.016 c