Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача между сокетами с использованием CArchive / 5 сообщений из 5, страница 1 из 1
08.06.2006, 12:28
    #33780200
egghead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача между сокетами с использованием CArchive
у меня есть клиент и сервер на MFC. они работают через сокеты.
есть класс B (в нем нет методов, но могут быть вектора stl). Могу ли я передать элемент этого класса через сокет с использованием CArchive. Я просто читал в мсдн что вроде это реально. Прав ли я.
Сейчас у все побайтно работает. Считывается заголовок потом идет обработка.
А хотелось бы сразу передать объект. Как мне это можно сделать?
Спасибо
...
Рейтинг: 0 / 0
08.06.2006, 13:19
    #33780419
NSFuimus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача между сокетами с использованием CArchive
Ни в коем случае не используй CSocket класс MFC и все приблуды к нему типа CSocketFile - проблем не огребешь ... работай через CAsyncSocket ...
по существу вопроса не понимаю твоих затруднений ... передаваться в любом случае будет поток байт ... а ты что хотел? ... пиши для своего класса серелизацию через CArchive, используя например CMemoFile, потом делаешь Detach из файла - получишь свои байты и передавай их как обычно ... на сервере также пишешь все принятые байты в CMemoFile делаешь обратную серелизацию через CArchive и получаешь свой объект ... ты это хотел услышать?
...
Рейтинг: 0 / 0
08.06.2006, 13:57
    #33780579
egghead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача между сокетами с использованием CArchive
Да!
1.А еще тогда встречный вопрос если в классе будут методы которые будут выполняться локально (т.е. одинаковый класс и у клиента и сервера, но передаются только данные). Скажется ли это как то
2. Можно небольшой пример как это реализовать

Спасибо!
...
Рейтинг: 0 / 0
08.06.2006, 14:34
    #33780712
NSFuimus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача между сокетами с использованием CArchive
хех ...
1. не понял ... если твой класс(объект те который ты создал на его основе) работает в определенном окружении ... ммм... внешних данных (внешняя среда?), то разумеется на сервере эта самая среда тебе будет недоступна ... если ты и ее не передашь :))
2. эээ ... серелизацию опустим ... ну не знаю ... так чтоли
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class CClientSocket : public CAsyncSocket
{
...
public:
	CMemFile m_memFile;
...
}
из среды формируешь пакет как-то так :
инициализируешь CMemFile перед формированием нового пакета:
Код: plaintext
1.
2.
3.
	BYTE* pByte = m_ClientSocket.m_memFile.Detach();
	if (pByte != NULL)
		free(pByte);
затем начинаешь формировать пакет
Код: plaintext
1.
2.
3.
4.
5.
	CArchive ar(m_ClientSocket.m_memFile, CArchive::store);
	COleDateTime dtParam = COleDateTime::GetCurrentTime;
	ar << dtParam;
	ar.Flush();
	ar.Close();
- в одном месте
Код: plaintext
1.
2.
3.
4.
5.
	CArchive ar(m_ClientSocket.m_memFile, CArchive::store);
         double dbValue =  0 ;
	ar << dbValue;
	ar.Flush();
	ar.Close();
- из другого места ... и тд указатель позиции в файле всегда будет указывать на конец файла, те он постоянно будет дописыаться типа ... ну и потом вызываешь метод передачи данных в котором получаешь байты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	DWORD dwSendDataLen = (DWORD) m_ClientSocket.m_memFile.GetLength();
	BYTE* pByte = m_ClientSocket.m_memFile.Detach();
...
//здесь передаешь данные 
...
	if (pByte != NULL)
		free(pByte);
и еще ... если ты работаешь по классической схеме, те первые 4 (int) байта - размер пакета, то допиши в начало CMemFile этот размер, те когда пакет сформирован берешь длину файла и пишешь ее в начало этого файла ...
ну а на сервере пишешь приходящие байты в CMemFile (кроме тех самых первых четырех, разумеется) затем
Код: plaintext
1.
2.
3.
4.
5.
	CArchive ar(&m_memFile, CArchive::load);
	COleDateTime dtParam;
	ar >> dtParam;
         double dbValue;
	ar >> dbValue;
вот и фсе ...
...
Рейтинг: 0 / 0
08.06.2006, 15:11
    #33780863
egghead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача между сокетами с использованием CArchive
Спасибо!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача между сокетами с использованием CArchive / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]