Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1193292166
F@T@L_Err0r
2007-10-25 10:02
2007.11.18
Пустая переменная


2-1193206076
DDDeN
2007-10-24 10:07
2007.11.18
Удалить строку или столбец из TStringGrid


2-1193617178
Nikola
2007-10-29 03:19
2007.11.18
Отображение данных в DBGrid


15-1192103772
Квэнди
2007-10-11 15:56
2007.11.18
Поиск литературы по потокам


2-1193250237
GanibalLector
2007-10-24 22:23
2007.11.18
более точный аналог GetTickCount