Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пересылка данных по указателям 
V
    Опции темы
kuvshinka
Дата 9.2.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть две программы – prog1 и prog2:
мне надо пересылать данные по сети между этими прогами: 
допустим из prog1 я хочу пересылать в prog2 переменную i++, а получать от prog2 значение 
i+=2 (то есть prog2 отсылает значение на единицу больше, чем она получила от prog1). это осуществляется некими самодельными функциями send(char *b) и read(char *c), одним из параметров которых является указатель(адрес) на пересылаемый буфер с данными... 
подскажите пож-та как с ним (с этим указателем) надо правильно обращаться: записать переменную i в буфер b (или с) в одной программе и прочитать ее другой программой... что-то никак не разберусь я с этими указателями...помогите таким примерчиком...

PM MAIL   Вверх
jonie
Дата 9.2.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



указатели вам не помогут, у двух процессов разные адресные (изолированные друг от друга) пространства. Т.е. даже если указатель имеет в двух процессах значение char*p = (char*)0xBADF00D;, то это будут совершенно разные разные области памяти (притом еще неизвестно где, в реальной памяти, свопе или еще где-то в дебрях менджера памяти).

Обмен данными, о котором говорите вы, обычно называется shared memory и накладывает определенные ограничения (по сети эта память вообще не передается).

вам нужно просто по сети пересылать сами значения указываемых величин (т.е. НЕ указателей), и далее в программах их интерпретировать.

Это сообщение отредактировал(а) jonie - 9.2.2010, 20:45


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kuvshinka
Дата 9.2.2010, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не...если взять например любую функцию работы с сокетами, то там как раз передаваемый буфер задается именно указателем...
PM MAIL   Вверх
bsa
Дата 10.2.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



kuvshinka, пересылаются данные, хранящиеся в буфере, на который указывает указатель. Не надо путать понятия "данные" и "указатель на данные".
Ты сначала сделай пересылку данных - это 99,99% работы, а потом уже будешь заморачиваться на приращение.
PM   Вверх
kuvshinka
Дата 10.2.2010, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



функции пересылки у меня есть - и там параметром задается указатель на пересылаемый буфер (в который пишутся/ считываются данные)....
вот я и хочу разобраться с тем, как данные записать в буфер и прочитать их из него на другой стороне (компьютере) с использованием указателей (то есть пытаюсь понять методику использования здесь указателей, поэтому и прошу дать простенький пример  на "пересылку (то есть просто запись данных в массив(указатель)) данных, хранящихся в буфере, на который указывает указатель"

Это сообщение отредактировал(а) kuvshinka - 10.2.2010, 21:06
PM MAIL   Вверх
bsa
Дата 10.2.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
int var;
...
send(static_cast<char*>(static_cast<void*>(&var)), sizeof(var));


Код
int var;
recv(static_cast<char*>(static_cast<void*>(&var)), sizeof(var));

PM   Вверх
kuvshinka
Дата 10.2.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вау.. а что так сложно "static_cast<char*>(static_cast<void*>"? что сие означает?
нельзя как-то так?:
Код

char *var;
recv( (char *)var,...);

и почему var приводится именно к char?
 то есть в Вашем примере передается адрес переменной (var) с заранее записанными в нее данными? а как мне их прочитать в какую-то другую переменную? 
PM MAIL   Вверх
bsa
Дата 10.2.2010, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



recv( (char *)var,...) - это совсем не то, что recv( (char *)&var,...).

kuvshinka, давай ты сначала почитаешь про указатели из Часто задаваемых вопросов. А потом уже будешь задавать правильные вопросы, на которые можно будет дать корректный ответ не пытаясь догадаться, что ты имела в виду.
PM   Вверх
kuvshinka
Дата 10.2.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спасибо за ссылку...обязательно еще раз постараюсь вникнуть...
просто хотелось понять смысл таких манипуляций - recv( (char *)&var,...) - одной фразой... 
PM MAIL   Вверх
bsa
Дата 10.2.2010, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



отправляем sizeof(var) char'ов начиная с адреса размещения переменной var.
PM   Вверх
kuvshinka
Дата 11.2.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а адрес размещения переменной var мы узнаем при ее объявлении?
каким образом тогда из другой программы прочитать данные из этой var в другую переменную?
PM MAIL   Вверх
SVN74
Дата 11.2.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 18



Вот примерчик отсылки INT(а) с контролем пересылки:
=========================================
Код

bool SendINT(SOCKET inSock, int *Vr)
{
  if(Vr == NULL) return false;
  int F = sizeof(int)*2;
  int C[2] = {*Vr,*Vr};
  if(send(inSock,(char*)&C[0], F,0)!= F) return false;
  return true;
}
//---------------------------------------------------------------
bool RecvINT(SOCKET inSock, int *Vr)
{
  if(Vr == NULL) return false;
  int F = sizeof(int)*2;
  int C[2]= {0,0};
  if(recv(inSock,(char*)&C[0], F,0)!= F) return false;
  if(C[0] != C[1])
  {
    // Integer read error
    return false;
  }
  *Vr = C[0];
    return true;
}
=========================================
Пример использования:
int  A = 5;
SendINT(MySock, &A);
------->>>>> 
int B = 0;
RecvINT(MySock, &B);
------->>>>> B++;
SendINT(MySock, &B);
------->>>>>
RecvINT(MySock, &A);
//// 
A = 6;

PM MAIL WWW   Вверх
bsa
Дата 11.2.2010, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(kuvshinka @  11.2.2010,  00:01 Найти цитируемый пост)
а адрес размещения переменной var мы узнаем при ее объявлении?
Адрес можно узнать написав перед именем переменной амперсанд: &var
Цитата(kuvshinka @  11.2.2010,  00:01 Найти цитируемый пост)
каким образом тогда из другой программы прочитать данные из этой var в другую переменную? 
Очень просто. Функция send байт за байтом отправит по сети данные на другой комп. Там функция recv эти данные получит, соберет и положит в переменную, указатель на которую будет ей передан в качестве параметра. Тут полная аналогия с файлами. Только для файлов ты используешь write и read.

Может стоит все-таки сначала разобраться с работой и смыслом указателей, а уже потом заниматься передачей по сети? Так как передача по сети очень непростое дело.

PM   Вверх
Леопольд
Дата 11.2.2010, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @  11.2.2010,  01:06 Найти цитируемый пост)
передача по сети очень непростое дело

Перед тем как писать сетевые приложения, желательно почитать теорию.
Лично я сейчас потихоньку осваиваю Танеbаума "Компьютерные сети" ~1000 стр. У автора неподражаемый стиль, читать интересно, несмотря на размеры...
К тому же надо искать современную литературу. Всё течёт и изменяется, к примеру - классовая адресация в IP устарела.

Это сообщение отредактировал(а) Леопольд - 11.2.2010, 18:15


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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