Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> send() and recv() 
:(
    Опции темы
a.S.d
Дата 29.6.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



Есть клиент на делфи и сервер на С. Сервер принимает строку так:
Код

char *buff;
buff = new char[255];
recv(client, &buff[0], sizeof(buff), 0);

Клиент посылает строку:
Код

var DataToSend:string;
      asd:pchar;
//****
asd:=pchar(DataToSend);
a:=Send(sock, asd, strlen(asd), 0);

В итоге на сервер приходит какая-то чушь. Как нужно послать строку, чтобы её можно было получить на сервере, вызвав один раз функцию recv?

Это сообщение отредактировал(а) a.S.d - 29.6.2005, 22:30
PM MAIL   Вверх
SoWa
Дата 29.6.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 3
Всего: 74



А ты уверен в корректности работы процедуры
Цитата
asd:=pchar(DataToSend);
? Или попробуй принять это Дельфийским сервером. Если чушь- то ошибка в коде, если нет, то во взаимодействии программ.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
a.S.d
Дата 30.6.2005, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



С дельфийским сервером то же самое.
PM MAIL   Вверх
RA
Дата 30.6.2005, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



Код

procedure TForm1.Button1Click(Sender: TObject);
var
     buf:array[0..65535]of char;
     j,i:integer;
begin
     j:=0;

     Buf[0]:='T';
     Buf[1]:='E';
     Buf[2]:='S';
     Buf[3]:='T';

          for i:=0 to sizeof(buf) do if buf[i]=#0 then
          begin buf[i]:=#13;
          j:=i+1;
          break;
          end;
     send(sock,buf,j,0);
end;

PM   Вверх
a.S.d
Дата 30.6.2005, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



Переделал функцию отправки:
Код

procedure SendData(Data:string);
var asd:array [1..65535] of char;
i: integer;
begin
     for i := 1 to length(Data) do
     asd[i]:=data[i];
     a:=Send(sock, asd, length(Data), 0);
end;

Вроде отправляет нормально, но теперь проблема с сервером. Нормально он принимает за один вызов recv только строку из 3-х символов. Например если послать 'asd' то сервер после вызова recv вернёт в буфер 'asd', если например послать 'test', то на сервере будет 'test@:', если посылать более длинные строки, то сервер принимает их уже несколькими вызовами recv.
И вообще какое максимальное количество байт может принять сервер вызовом recv?
Добавлено @ 11:15
Кстати на сервер приходит то же самое если писать не на АПИ, а с использованием TClientSocket.
PM MAIL   Вверх
RA
Дата 1.7.2005, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



a.S.d Мне кажется проблема в сервере. Давай посмотрим его исходник.
Добавлено @ 10:44
Кстати:
procedure SendData(Data:string);
var asd:array [1..65535] of char;
i: integer;
begin
for i := 1 to length(Data) do
asd[i]:=data[i];
a:=Send(sock, asd, i, 0);
end;

PM   Вверх
a.S.d
Дата 1.7.2005, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



RAdmin
Да, проблема была с сервером. Решил её так:
Код

char recvbuf[32] = "";
while((bytes_recv = recv(client,recvbuf,32,0))&&bytes_recv!=SOCKET_ERROR)
{
        //здесь обработка полученной информации
    for(int i=0;i<32;i++) //затем обнуление принимающего буфера
        recvbuf[i] = 0;
}

Единственное, что мне тут не нравится, это что можно принять за один раз только 32 байта. Придётся принимать несколькими вызовами recv. Но как тут узнать, что передача строки закончена?

Добавлено @ 14:33
Цитата(RAdmin @ 1.7.2005, 10:42)

a:=Send(sock, asd, i, 0);

А что конкретно здесь тебе не нравится?

PM MAIL   Вверх
RA
Дата 1.7.2005, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



Максимальный размер пакета состовляет 65535 байт.

Цитата
А что конкретно здесь тебе не нравится?

Это я показал как лутше сделать smile




Цитата(a @ 1.7.2005, 14:28)
Но как тут узнать, что передача строки закончена?

Можно длбавлять в конец строки спец сигнатуру, тогда сервер приняв её поймёт что это конец.

А можно от клиента послать спец сообщение, что мол всё отправленно.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.