Help! Нужна помощь. Есть две программы: одна - сервер, вторая - клиент. Клиент отсылает данные, сервер - эти данные принимает.
На клиенте я формирую две записи (служебные)и массив данных (всё это я хочу передать серверу), далее с помощью move я объедению в единый блок памяти, а потом отсылаю:
| Код | const n = 3;
type TCode = longint; TData = double; TAction = integer;
TPack1 = packed record Code : TCode; Data : TData; Action : TAction; end;
TPack2 = packed record Code : TCode; Data : TData; end;
TArrPack = array of TPack2;
var i,size1, size2, size3 : integer; Pack1 : TPack1; Pack2 : TPack2; ArrPack : TArrPack; p : array of byte;
begin size1:=sizeof(TPack1); size2:=sizeof(TPack2); size3:=n*sizeof(TPack2);
Pack1.Code:=111; Pack1.Data:=222; Pack1.Action:=333; Pack2.Code:=444; Pack2.Data:=555;
randomize; SetLength(ArrPack,n); for i:=0 to n-1 do begin ArrPack[i].Code:=i+1; ArrPack[i].Data:=10+random(2000); end;
Size:=size1+size2+size3; SetLength(P,Size); move(X1,P[0],Count1); move(X2,P[Count1],Count2); move(X3,P[Count1+Count2],Count3); Socket.SendBuf(P[0],Size);
end;
|
На сервере я принимаю данные:
| Код | type TCode = longint; TData = double; TAction = integer;
TPack1 = packed record Code : TCode; Data : TData; Action : TAction; end;
TPack2 = packed record Code : TCode; Data : TData; end;
TArrPack = array of TPack2;
var i,j,size1, size2, size, size3 : integer; Pack1 : TPack1; Pack2 : TPack2; ArrPack : TArrPack;
begin
size:=Socket.ReceiveLength; size1:=sizeof(TPack1); size2:=sizeof(TPack2); size3:=size-size1-size2;
SetLength(ArrPack,size3 div size2);
Socket.ReceiveBuf(Pack1,size1); Socket.ReceiveBuf(Pack2,size2); Socket.ReceiveBuf(ArrPack[0],size3); finalize(ArrPack);
end;
|
ВОПРОС: когда клиент посылает данные (например, нажал кнопку ОТПРАВИТЬ), данные приходять на сервер, но потом сразу же возникает ошибка (бывает не сразу - надо бысто несколько раз на клиентской стороне нажать кнопку ОТПРАВИТЬ) и разрывается связь.
Ошибка такого плана: Windows socket error : Невозможно выполнить операцию на сокете, т.к. буфер слишком мал или очередь переполнена (10055), on API 'recv'.
ПОМОГИТЕ, ПОЖАЛУЙСТА!
|