Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.11.2008, 16:53
nikolay929 вне форума Посмотреть профиль Отправить личное сообщение для nikolay929 Найти все сообщения от nikolay929
  № 1  
Ответить с цитированием
nikolay929

Регистрация: Nov 2008
Сообщений: 2
По умолчанию localconnection data > 255 exe <-> swf

Привет.
Необходимо реализовать обмен данными между exe файлом и флешкой. Проблема в следующем: если написать флешку, назовём client.swf которая отошлёт строку по localconnection(lc) размером более 255 байт, то, если написать флешку, server.swf которая эти данные примёт всё будет ок. Но мне необходимо из exe послать строку более 255 и во флешке её принять. Я взял пример реализации lc на си++, который шлёт чтолибо по lc флешке. Если длина строки будет меньше 256, флеш замечательно всё примет. А если больше, то будет резаться. Строка, по сорсу, ложится так :
Код:
int writeAMFString(const char * str, int pos)
{
	int len = strlen(str);
	buffer[pos++] = 0x02;
	buffer[pos++] = 0; // string length is badly encoded here!
             buffer[pos++] = (char)(len & 0xff);
	
	strcpy((char*)&buffer[pos], str);
	pos += len;
	return pos;
}
Как видими длина данных задаётся одним байтом о_О. Тогда понятно почему данные режутся. Например при длине строки в 257 прилетит тока один символ.
По этой функции, полностью видим протокол lc :
Код:
int writeMessage(const char * msg)
{
	DWORD *timestamp = (DWORD*)&buffer[8];
	DWORD *size = (DWORD*)&buffer[12];
	int pos = 16;
	// check timestamp and size
	if (*size) return 0;
	*timestamp = GetTickCount();
	// write connection name
	pos = writeAMFString(listenerConnectionName, pos);
	// write protocol
	pos = writeAMFString(protocolName, pos);
	// write method name
	pos = writeAMFString(listenerMethod, pos);
	// write message
	printf("size: %d\n", strlen(msg));
	pos = writeAMFString(msg, pos, true);
	*size = pos-16;
	// report
	printf("Written: timestamp=%d, size=%d\n", *timestamp, *size);
	// dump memory
	//dumpMemory(0, *size+16);
	return 1;
}
Вопрос такой, если по протоколу, по крайней мере как он реализован на сях, мы можем послать только 255 байт, как флеш флешу шлёт большИе данные без проблем ?

Кстати, када флеш мне чото слал, у меня тоже всё резалось. Но, забив на байт длины, а рулясь фанкой strcpy, принимаю большие строки без проблем

Старый 22.11.2008, 17:16
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Что-то этот writeAMFString кривоват, особенно коммент, где записывается нулевой байт, красноречив. Вообще длина строки описывается двумя байтами, а тут первый равен 0, отсюда и проблемы.

Старый 22.11.2008, 21:47
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 3  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Знакомый исходник.
Ну, по LocalConnection больше 40960 байт не передашь.
А чтоб не резалось можно делать так:
Код:
int writeAMFString(char * str, int pos, char* buffer){
	WORD len = (WORD)strlen(str);
	buffer[pos++] = 0x02;
     // Согласно спецификации AMF 0x02 означает строковый тип передаваемых данных
	buffer[pos++] = HIBYTE(len);
	buffer[pos++] = LOBYTE(len);
	lstrcpy((char*)&buffer[pos], str);
	pos += len;
	return pos;
}
Код:
int getInfo(char* item, char* buffer, int pos)
{
	WORD* llen;
	char lenbuf[2];
	lenbuf[0]=buffer[pos];
	lenbuf[1]=buffer[pos-1];
	llen=(WORD*)&lenbuf[0];
	memcpy(item, &buffer[pos+1], *llen);
	item[*llen] = 0;
	pos += 1+(int)*llen+2;
	return pos;
}
int readMessage(char* buffer)
{	
	int res = 0;
	DWORD* timestamp = (DWORD*)&buffer[8];
	DWORD *size = (DWORD*)&buffer[12];
   // если размер нулевой - значит либо сообщение уже прочитано, либо некорректно отправлено, скажем, на несущ. коннект
	if (!(*size))return res;
   // имена метода(method), домена(domain), соединения(dest) и сообщение (msg). 
	char msg[40960];
	char dest[256];
	char method[256];
	char domain[256];

	int index = 16+2;
	index = getInfo((char*)&dest, buffer, index);
	index = getInfo((char*)&domain, buffer, index);
	index = getInfo((char*)&method, buffer, index);
	index = getInfo((char*)&msg, buffer, index);

       // buffer содержит начальный адрес расшаренной через FileMapping памяти
       // разобрали буфер, дальше идут действия на 
       //оcнове  полученной инфы, res будет каким-то ...
       // ...
       return res;
}
readMessage можно допилить, оснастив динамическим выделением памяти, или работать прямо с буфером по индексам.
А работает LC по протоколу AMF.


Последний раз редактировалось alexcon314; 23.11.2008 в 22:18.
Старый 23.11.2008, 11:26
nikolay929 вне форума Посмотреть профиль Отправить личное сообщение для nikolay929 Найти все сообщения от nikolay929
  № 4  
Ответить с цитированием
nikolay929

Регистрация: Nov 2008
Сообщений: 2
спасибки я дурак не посмотрел AMF формат, понадеялся на автора. А у него комент для хай байта длины действительно ни о чом

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:31.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.