Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2008, 23:35   #1
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию Socket.SendBuf\ResiveBuf

Пожалуйста скажите что я делаю не так:
Код:
procedure TMainWindow.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
    Socket.SendBuf(TestList,sizeof(TestList));
end;
серверная часть. Как только клиент подключается ему сразу высылаются данные TestList:TStringList, TestList формируется при загрузке приложения .

Код:
procedure TLoginWindow.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var TestList:TStringList;
begin
    TestList:=TStringList.Create;
    Socket.ReceiveBuf(TestList,Socket.ReceiveLength);
    Test_List.Items.AddStrings(TestList);
    TestList.Free;
end;
клиентская часть. принимает данные и выводит в ListBox.

Вылитает ошибка Access Violation.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 11.06.2008, 23:40   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

на какой строке вылетает ошибка ?
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 11.06.2008, 23:45   #3
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

после строки TestList.Free;
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 12.06.2008, 00:02   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

2SunKnight
Вы же указатель передаете.
На что же он будет указывать у клиента ?

TestList:=TStringList.Create;
Socket.ReceiveBuf(TestList,Socket.R eceiveLength); // затирает указатель TestList
alexBlack вне форума Ответить с цитированием
Старый 12.06.2008, 00:08   #5
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

А как тогда правильно принять? Пожалуйста вразумите нуба.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 12.06.2008, 00:24   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Или передавать каждую строку

Код:
S := '';
for i:=0 to testList.count-1 do begin
   S := S + TestList[i]+#10;
end;
Socket.SendBuf(S[1], length(S))
...
и у клиента делить по #10

или getText / setText

на сервере:
Код:
P:PChar;
   P := TestList.getText;
   C := StrLen(P)+1;   // 0 в конце
   Socket.SendBuf(P^, C);
   // getText делает StrNew, значит нужно освобождать
   StrDispose(P);
у клиента

Код:
testList := TStringList.Create;
getMem(P, Socket.ReceiveLength);
Socket.ReceiveBuf(P^, Socket.ReceiveLength);   
testList.setText... 
freeMem(P);
Кажется, все правильно. Проверил на записи/чтении в файл.
Вызовы SendBuf/ReceiveBuf аналогично write/read:
Код:
var L:TStringList;
    P:PChar;
    F:TFileStream;
    C:integer;
begin
   F := TFileStream.Create('a.txt', fmCreate);
   L := TStringList.Create;
   L.add('aaaaa');
   L.add('bbbbb');
   L.add('ccccc');
   try;
      P := L.getText;
      C := StrLen(P);
      F.write(P^, C+1);
      StrDispose(P);
      ------------------------------
      F.seek(0, 0);
      getMem(P, C+1);
      F.read(P^, C+1);
      L.Clear;
      L.setText(P);
      freeMem(P);
   finally
      L.free;
      F.free;
   end;

Последний раз редактировалось alexBlack; 12.06.2008 в 00:38. Причина: Исправил пример с PChar
alexBlack вне форума Ответить с цитированием
Старый 13.06.2008, 10:26   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Та ну не верно. Не предусмотрено что данные пакетами шлются... Тогда все пойдет криво накося Я бы на вашем месте сводил бы все к какому нибудь формату, а не так просто брать и слать данные. Например заголовок, который хранит сколько строк будет и какой размер потом идут пакеты типа новая строка и ее длина и т.д. и т.п. Ну а тот кто принимает соответственно путь у него будет переменная которая будет указывать какая строка принимается какой длинны и сколько уже принято, чтобы в дальнейшем уже принимать дальше или если уже общая длинна достигла значения равное длинне которая приходила в заголовке... НУ думаю смысл ясен.
BOBAH13 вне форума Ответить с цитированием
Старый 13.06.2008, 12:43   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Та ну не верно. Не предусмотрено что данные пакетами шлются... Тогда все пойдет криво накося Я бы на вашем месте сводил бы все к какому нибудь формату, а не так просто брать и слать данные. Например заголовок, который хранит сколько строк будет и какой размер потом идут пакеты типа новая строка и ее длина и т.д. и т.п. Ну а тот кто принимает соответственно путь у него будет переменная которая будет указывать какая строка принимается какой длинны и сколько уже принято, чтобы в дальнейшем уже принимать дальше или если уже общая длинна достигла значения равное длинне которая приходила в заголовке... НУ думаю смысл ясен.
Это все конечно верно, но мне показалось, что такое объяснение выходит за рамки вопроса. Основная проблема была в том, что передавался указатель на данные, а не сами данные. Если бы в ответ я стал бы распространяться о дейтаграммах UDP и правилах передачи TCP-пакетов, то мы сейчас мы бы даже не подошли к решению вопроса.

Автору вопроса приношу извинения, если ввел в заблуждение. Поверьте, это не намеренно.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ServerSocket recievebuf и sendbuf ilyano Работа с сетью в Delphi 4 09.11.2017 17:47
UDP & Socket Shouldercannon Работа с сетью в Delphi 14 13.10.2008 17:23
Socket Get Editor Работа с сетью в Delphi 7 22.04.2008 05:48
Socket vs Stream JoanM Работа с сетью в Delphi 1 01.04.2008 10:10
Socket Delphi 7 merax Работа с сетью в Delphi 1 09.02.2007 10:32