![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Nov 2008
Сообщений: 2
|
Привет.
Необходимо реализовать обмен данными между 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;
}
По этой функции, полностью видим протокол 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;
}
Кстати, када флеш мне чото слал, у меня тоже всё резалось. Но, забив на байт длины, а рулясь фанкой strcpy, принимаю большие строки без проблем ![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Что-то этот writeAMFString кривоват, особенно коммент, где записывается нулевой байт, красноречив. Вообще длина строки описывается двумя байтами, а тут первый равен 0, отсюда и проблемы.
|
|
|||||
|
listener
|
Знакомый исходник
.Ну, по 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;
}
А работает LC по протоколу AMF. Последний раз редактировалось alexcon314; 23.11.2008 в 22:18. |
|
|||||
|
Регистрация: Nov 2008
Сообщений: 2
|
спасибки
я дурак не посмотрел AMF формат, понадеялся на автора. А у него комент для хай байта длины действительно ни о чом ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|