Форум: "Сети";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];
ВнизSockets Найти похожие ветки
← →
dkDimon (2002-11-04 14:48) [0]МОжет кто-нибудь привести примерчик передачи и принятия буфера в TClientSocket & TServerSocket (SendBuf, ReceiveBuf) записей (record). Ну или скажите что я делаю неправильно:
Клиент:
type
TSendInfo = packed record
Cmd: String;
Data: Pointer;
end;
...
procedure Send;
var
si: TSendInfo;
begin
si.Cmd := "Command";
si.Data := ... (чему-нибудь);
ClientSocket.Socket.SendBuf(si, SizeOf(si));
end;
Сервер:
type
TSendInfo = packed record
Cmd: String;
Data: Pointer;
end;
...
procedure Receive;
var
si: TSendInfo;
begin
ServerSocket.Socket.ReceiveBuf(si, ServerSocket.Socket.ReceiveLenth);
end;
ОШИБКА!!! Access violation...
Плиз, помогите кто чем может...
← →
Digitman (2002-11-04 14:54) [1]
> TSendInfo = packed record
> Cmd: String;
> Data: Pointer;
> end;
Проверь, чему равен SizeOf(si) в случае
si.Cmd := "Command"
и в случае
si.Cmd := "Another Command"
это заставит тебя призадуматься
← →
Моджахед (2002-11-05 20:50) [2]Тут тебе намекают вот чего.
Ты чего это, редиска, по сетке пойнтеры шлешь, а? Ты бы еще адрес бабушки послал....
Указатель этот твой куда указывает? На твою ведь область памяти, так твою... Или ты думал указатель передашь, а все остальное из твоей оперативки на другую машину автоматом переместится. Вот и думай, откудыть ростуть руки, короче типа.
← →
Моджахед (2002-11-05 20:55) [3]Ну блин, ну блин, язык так и чешется.
А подумай, как хорошо было-бы... Ты по сетке шлешь селектор и смещение данных. А данные в данный момент в свопе лежат. И умный сокет шлет по шнурку своп-файл. Борландам посоветуем ;)
← →
Kotka (2002-11-05 22:08) [4]А вот мне не нравится эта строка: ServerSocket.Socket.ReceiveBuf(si, ServerSocket.Socket.ReceiveLenth);
хм!
← →
Polevi (2002-11-06 09:14) [5]2Моджахед (05.11.02 20:55)
ничего, мастдай все замаршалит :)
← →
dkDimon (2002-11-11 15:38) [6]Удалено модератором
← →
Digitman (2002-11-11 15:57) [7]Прекрати мат и свои дурацкие обиды !
И объясняй подробно, что значит
> даже если не пойнтер посылать
Код приводи ! Пусть даже и неработающий ! Только тогда помощь реальную получишь и что-то уяснишь для себя ...
← →
dkDimon (2002-12-05 16:44) [8]После долгого перерыва я вернулся опять. Вот код.
Client
type
TSendInfo = packed record
Data: String;
end;
procedure Send;
var
si: TSendInfo;
begin
si.Data := "TestData";
ClientSocket1.Socket.SendBuf(si, SizeOf(si));
{вот тут я не знаю как писать размер - SizeOf(si)?}
end;
Server
procedure Receive;
var
si: TSendInfo;
begin
{а тут я вообще не знаю как получить...}
end;
Вы наверное спросите, не легче ли послать с помощью SendText, т.к. в записи только строка. Нет. Т.к. там будут еще данные - это только пример.
← →
Digitman (2002-12-05 16:52) [9]
> Вот код.
Та же самая ошибка.
← →
Digitman (2002-12-05 16:57) [10]данные AnsiString-типов следует посылать либо by SendText(), либо двумя последовательными вызовами SendBuf()/SendStream(), первый из которых посылает длину строки, второй - собственно данные строки (находящиеся по адресу PChar(MyString))
← →
apple (2002-12-06 13:21) [11]Нет никакой разницы- SendBuf or SendText- строка тот же набор байт- спокойно передаются и тексты и изображения.Просто со строками проще работать.
← →
Digitman (2002-12-06 13:47) [12]
> apple
Это ты к чему ?
← →
Reindeer Moss Eater (2002-12-06 13:59) [13]>DkDimon
Было
type
TSendInfo = packed record
Cmd: String;
Data: Pointer;
end;
Объяснили, что указатели слать бесполезно
Cтало
type
TSendInfo = packed record
Data: String;
end;
Что изменилось?
Вместо двух указателей шлется всего один.
Налицо прогресс :)
← →
CyANiD (2002-12-10 14:54) [14]Вообще у меня не получаеться пересылать буфер, если server и client - разные проги. Если это все в одной проге, то проблем нет. Да и тип (record) посылаемого сообщения должен быть аналогичен принимаемому... Подумай на эту тему, если ничего не приходит в голову, то пиши на mail мне, пришлу тебе исходники
← →
Danlicha (2002-12-10 17:36) [15]:)
← →
Sheriff (2002-12-11 10:20) [16]Если есть желание переслать всю запись сразу:
Bred = record
Cmd: Integer;
Status: Integer;
TimeSend: TTime;
Mess: String[255];
end;
если указать Mess: String; то Mess придется передавать отдельно.
← →
ole (2002-12-14 11:34) [17]На событие клиента OnConnect отправить данные:
SendBuf(Buf, SizeOf(Buf));
На сервере
1. при неблокирующем подключении:
OnClientRead
Socket.ReceiveBif(Buf,Socket.ReceiveLength);
2. при блокирующем подключении:
создать Thread по запросу сервера
(ClientExecute):
ClientSocket.ReceiveBuf и т.д.
или, что удобнее
создать TWinSocketStream
далее считывать из Stream"а, а можно и записывать в него.
все есть в хелпе Дельфов...
← →
Sinplecy (2003-02-03 13:05) [18]Удалено модератором
← →
Digitman (2003-02-03 13:47) [19]
> Sinplecy
расскажи подробно, как ты себе представляешь логику возникновения и обработки события OnWrite()
← →
Sinplecy (2003-02-04 08:43) [20]OnWrite - событие, возникающее в TClientSocket в случае получения разрешение на посылку данных от TServerSocket.
Я так это понял.
На всякий случай еще раз слазал в help -
Occurs when a client socket should write information to the socket connection.
← →
Digitman (2003-02-04 09:02) [21]
> Sinplecy
> в случае получения разрешение на посылку данных от TServerSocket.
Почему же "от" ? "в" !!!
После установки вирт.петли соединения между двумя удал.партнерами (неважно кто из них сервер, а кто - клиент) у каждой из сторон есть по одному экз-ру "передатчика" и "приемника". И передача и прием используют внутреннюю буферизацию ввода/вывода, размеры этих буферов ограничены. Например, внутр.буфер передачи в большинстве тек.реализаций WSP имеет размер в умолчанию в 8кб. Попытка записи в этот буфер в неблок.режиме блока данных общим размером более 8кб (в один или несколько вызовов send-методов) вызовет отказ с кодом WSAEWOULDBLOCK, сигнализирующий о "занятости" буфера передачи невозможности в дан.момент поместить в него требуемый к передаче блок данных. Как только буфер освободится (читай - данные будут физически "вытолкнуты" в канал связи с партнером), WinSock сообщит об этом возбуждением событий OnWrite() (для клиента) и OnClirntWrite() (для сервера). Кр. того WinSock извещает этими событиями партнеров по обмену о незанятости из буферов передачи как минимум 1 раз - сразу же после установления вирт.петли коннекта (сразу же за событием On[Client]Connect).
Т.о., если используется неблок.режим и вызов одного из send-методов (на любой стороне вирт.соединения) дал отказ, сигнализирующий о недоступности в дан.момент буфера передачи, необходимо дождаться ближ.события On[Client]Write и повторить попытку записи в буфер передачи тем же send-методом, но указав в нем параметрами уже только ту часть данных (требуемых к передаче), которая на этот момент еще не была помещена в буфер из-за предыдущего отказа при вызове send-метода.
← →
Sinplecy (2003-02-04 14:57) [22]Теперь понял. Спасибо!
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c