![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты [D6]
Александр_К © (2007-08-20 09:17:00)Можно ли через сокет клиента передать указатель на
структуру к сокету серверу,чтобы этот указатель остался актуальным и не была потеря данных.
Германн (2007-08-20 15:13:00) [1]
> Александр_К (20.08.07 09:17)
>
> Можно ли через сокет клиента передать указатель на
> структуру к сокету серверу,чтобы этот указатель остался
> актуальным и не была потеря данных.
>
Это что? Продолжение вчерашней бодяги
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1187526516&n=18?
Александр_К (2007-08-20 14:54:00) [2]Даже если поставить 2000-
Ничего не получится.
Пробробуйте сами.
clickmaker (2007-08-20 14:12:00) [3]
> [6] tio (20.08.07 14:07)
что значит одним проходом?
размер читаемой порции в функции recv - входной параметр, обязан быть
tio (2007-08-20 14:07:00) [4]а как одним проходом указать cbData?
Мне кажется не в этом дело, даже если будет указан cbData.
Пробовал ничего не получается.
clickmaker (2007-08-20 11:25:00) [5]
> kk:=WinSock.recv(Socket,s,s.cbData,0);
s.cbData не указано
Александр_К (2007-08-20 10:54:00) [6]Что-то не получается:
С клиентской стороны пример:
type
PSend = ^TSend;
TSend = Record
dwData: WORD;
cbData: WORD;
lpData: Pointer;
end;
var
s:TSend;
procedure TForm1.Button1Click(Sender: TObject);
var
k:Integer;
ab:Integer;
begin
ab:=345;
s.cbData := Sizeof(ab);
s.dwData:=0;
s.lpData := AllocMem(s.cbData);
Move(ab, s.lpData^, s.cbData);
k:=Client.Socket.SendBuf(s.lpData^, s.cbData);
end;
Я взял ab на примере Integer, но могла быть строка и т.д.
Сервер должен получить ab = 345;
//функция получения данных
procedure ReceiveData(const Socket:Word);
var
s:TSend;
kk:Integer;
ss:Integer;
begin
kk:=WinSock.recv(Socket,s,s.cbData,0);
if kk <>0 then
begin
ss:=Integer(s.lpData^);
// Messagebox(0,PChar(inttostr(kk)),PChar(Inttostr(ss)),mb_ok);
end;
end;
Сервер ПОлучает всякую ерунду,а не k = 345.
clickmaker (2007-08-20 10:13:00) [7]
> [2] Александр_К (20.08.07 10:06)
var s: send;
s.size := размер
s.data := AllocMem(s.size);
Move(данные, s.data^, s.size);
socket.SendBuf(s.data^, s.size);
Александр_К (2007-08-20 10:06:00) [8]просто имеются переменные данные (строки или файлы). Чтобы в сервере
создавать динамические массивы нужно сразу знать сколько придет и сами данные.
Пока это сделать не получается.
А через структуру, например:
type
send = record
size:Integer;
action:Byte;
data:Pointer;<-здесь могли бы висеть данные (указатели на строки или структуры или файлы), но так как они динамические я придумать пока ничего дополнительно не могу.
Elen (2007-08-20 09:42:00) [9]Указатель передать плевое дело, а данные по нему ты как читать собрался?