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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2010, 13:26   #1
pesi
Подтвердите свой е-майл
 
Регистрация: 05.03.2009
Сообщений: 65
По умолчанию Recv и динамический массив

Код:
var
Buf: Array [0..9] Of Char;


Recv(wSocket, Buf, 10, 0);
Код:
var
Buf: Array Of Char;

SetLength(Buf, 10);
Recv(wSocket, Buf[0], 10, 0);
С статическим массивом все работает, а с динамическим нет.
Можно ли использовать динамический массив, если да то как?
pesi вне форума Ответить с цитированием
Старый 18.09.2010, 13:31   #2
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Код:
Buf[0]
Указывайте весь массив, а не его 1 елемент.
ZaRDaK вне форума Ответить с цитированием
Старый 18.09.2010, 13:55   #3
pesi
Подтвердите свой е-майл
 
Регистрация: 05.03.2009
Сообщений: 65
По умолчанию

Код:
Recv(wSocket, Buf, 10, 0);
если так, то просто уходит в аут
pesi вне форума Ответить с цитированием
Старый 18.09.2010, 22:10   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

pesi, в начальном коде все верно было, что в нем не так работает?
(у вас char=AnsiChar? если да то все верно, иначе не забываем умножать на размер единицы массива(да и вообще всегда стоит так делать))
Код:
Recv(wSocket,Buf[0],Length(Buf)*SizeOf(Buf[0]){или SizeOf(Char)},0);
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2010, 13:02   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Recv(wSocket, @Buf[0], 10, 0);
для динамического массива попробуйте указть адрес первого елмента
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.09.2010, 13:05   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

evg_m, помоему ж в Делфи var механизм применен?(да я думаю не компилилось бы тогда)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 19.09.2010 в 13:10.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2010, 13:40   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

из первого поста
для статического массива работает
Recv(wSocket, Buf, 10, 0); ..// указан адрес массива (указатель на первый элемент)

для динамического неработает
Recv(wSocket, Buf[0], 10, 0); ..// указано ЗНАЧЕНИЕ первого biff[0]

Recv(wSocket, Buf, 10, 0); ..// не работает к.к. адрес ССЫЛКИ на массив (но не массив)

просим проверить
Recv(wSocket, @Buf[0], 10, 0); ..// указан АДРЕС первого @ biff[0]
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.09.2010 в 13:45.
evg_m вне форума Ответить с цитированием
Старый 19.09.2010, 13:42   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если честно мне еще не понятно в каком смысле не работает...
не компилится или не получает данные%)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2010, 17:22   #9
pesi
Подтвердите свой е-майл
 
Регистрация: 05.03.2009
Сообщений: 65
По умолчанию

Цитата:
просим проверить
Recv(wSocket, @Buf[0], 10, 0); ..// указан АДРЕС первого @ biff[0]
Так вообще не компилится.

Пепел Феникса, данные получаю но там каша(что то повторяется по несколько раз, а чего то нет).

Код получает страницу яндекса, посмотрите пожалуйста
Код:
var
  wData: TWSAData;
  wSocket:TSocket;
  wAdrr: SockAddr_In;

  Request: String;
  Buffer: Array of Char;
  RecvCount: Integer;
  Otvet: String;
begin
  if WSAStartup(MAKEWORD(2, 0), wData) <> 0 then
    Raise Exception.Create('Ошибка инициализации');

  wSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if wSocket = INVALID_SOCKET then
    Raise Exception.Create('Невозможно создать сокет!');

  wAdrr.sin_addr.S_addr := inet_addr(PChar('87.250.251.3'));
  wAdrr.sin_family:= AF_INET;
  wAdrr.sin_port := htons(80);

  if Connect(wSocket, wAdrr, SizeOf(wAdrr)) = SOCKET_ERROR Then
  begin
    WSACleanup();
    Raise Exception.CreateFmt('Connection error %d', [WSAGetLastError]);
  end;

  Request:= 'GET / HTTP/1.0'#13#10
           +'Host: www.yandex.ru'#13#10
           +'Connection: close'#13#10
           +#13#10;

  if Send(wSocket, Request[1], Length(Request), 0) = SOCKET_ERROR then
  begin
    CloseSocket(wSocket);
    WSACleanup();
    Raise Exception.CreateFmt('Ошибка при отправке!'#13#10'Error code %d', [WSAGetLastError]);
  end;

  RecvCount:= 1;
  Otvet:= '';

  SetLength(Buffer, 10);

  while RecvCount >  0 do
  begin
    RecvCount := Recv(wSocket, Buffer[0], Length(Buffer)*SizeOf(Buffer[0]), 0);
    Otvet:= Otvet + String(Buffer);
    if RecvCount = -1 then
    begin
      CloseSocket(wSocket);
      WSACleanup();
      Memo1.Text:= Otvet;
      Raise Exception.CreateFmt('Ошибка при чтении ответа!'#13#10'Error code %d', [WSAGetLastError]);
    end;
  end;

  Memo1.Text:= Otvet;
  CloseSocket(wSocket);
  WSACleanup;
end;
pesi вне форума Ответить с цитированием
Старый 19.09.2010, 17:36   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
var
  wData: TWSAData;
  wSocket:TSocket;
  wAdrr: SockAddr_In;

  Request: String;
  Buffer: ANSIString;
  RecvCount: Integer;
  Otvet: String;
begin
  if WSAStartup(MAKEWORD(2, 0), wData) <> 0 then
    Raise Exception.Create('Ошибка инициализации');

  wSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if wSocket = INVALID_SOCKET then
    Raise Exception.Create('Невозможно создать сокет!');

  wAdrr.sin_addr.S_addr := inet_addr(PChar('87.250.251.3'));
  wAdrr.sin_family:= AF_INET;
  wAdrr.sin_port := htons(80);

  if Connect(wSocket, wAdrr, SizeOf(wAdrr)) = SOCKET_ERROR Then
  begin
    WSACleanup();
    Raise Exception.CreateFmt('Connection error %d', [WSAGetLastError]);
  end;

  Request:= 'GET / HTTP/1.0'#13#10
           +'Host: www.yandex.ru'#13#10
           +'Connection: close'#13#10
           +#13#10;

  if Send(wSocket, Request[1], Length(Request), 0) = SOCKET_ERROR then
  begin
    CloseSocket(wSocket);
    WSACleanup();
    Raise Exception.CreateFmt('Ошибка при отправке!'#13#10'Error code %d', [WSAGetLastError]);
  end;

  RecvCount:= 1;
  Otvet:= '';

  //SetLength(Buffer, 10);//длину дальше ставим

  while RecvCount >  0 do
  begin
    SetLength(Buffer,1024);//побольше поставлю буфер
    RecvCount:=Recv(wSocket, Buffer[1], Length(Buffer)*SizeOf(ANSIChar), 0);
    SetLength(s,RecvCount);//если приняли менее чем длина строки то обрезаем строку, чтоб мусора не было
    Otvet:= Otvet + Buffer;
    if RecvCount = -1 then
    begin
      CloseSocket(wSocket);
      WSACleanup();
      Memo1.Text:= Otvet;
      Raise Exception.CreateFmt('Ошибка при чтении ответа!'#13#10'Error code %d', [WSAGetLastError]);
    end;
  end;

  Memo1.Text:= Otvet;
  CloseSocket(wSocket);
  WSACleanup;
end;
а если так?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив Golovastik Общие вопросы C/C++ 10 27.05.2010 20:36
Динамический массив! Mikhail91 Общие вопросы C/C++ 9 14.02.2010 14:45
динамический массив Diller Помощь студентам 48 07.10.2007 16:43
Динамический массив. Mickle Помощь студентам 9 21.06.2007 20:31
Динамический массив Mickle Общие вопросы Delphi 8 19.06.2007 06:45