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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача структуры через сокет 
:(
    Опции темы
leniviy
Дата 13.12.2008, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



имхо нельзя передавать борландовские строки через сокет. В дельфях это встроенный тип, в C++ скорее всего смарт поинтер, указатель на данные. А сами данные строки находятся в другой области памяти и не передаются.
Код

ret = recv(wParam, (char*)&MsgRecv, 1024, 0); // 1024 - макс. размер

здесь явное нарушение безопасности типов. Странно, что потом не выскакивает Access violation, но ничего, потом выскочит smile.

Хотите передать 3 строки за раз, придётся сначала перевести строки в char* , PChar или PAnsiChar
потом скопировать все 3 строки друг за другом в 1 блок памяти и передавать этот блок целиком.
С помощью "C" структур так сделать нельзя, потому что только последнее поле структуры может иметь вариабельный размер.

Я бы сделал по-другому, написал 2 функции:
sendMessage() и recvMessage() похожие на send() и recv() , только вместо аргументов buf и length аргумент типа Message.

внутри этих функций 3 раза (для MsgType,MsgIP и MsgText) вызываются соответственно sendString() и recvString()

в sendString()  в сокет сначала посылаете 4 байта (длину строки ) потом данные типа Pchar
в recvSring()  из сокета сначала читаете 4 байта (длину строки , len ) потом !в цикле! читаете в буфер типа PChar и не забывайте, что может понадобиться несколько вызовов recv, чтобы прочитать всю строку. Выставляете нолик в последнем байте буфера (buf[len]) и конвертируете PChar обратно в AnsiString


Это сообщение отредактировал(а) leniviy - 13.12.2008, 01:10
PM MAIL   Вверх
BasilL
Дата 13.12.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 26.5.2005
Где: Челябинск обл.

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



leniviy,
т.е. если я правильно понял - возможен такой вариант решения: изменить структуру Message так, чтобы только последнее поле имело непостоянный размер, например так

Код

struct Message
{
BYTE MsgType;    // или WORD MsgType
u_long MsgIP;    //u_long S_addr;
AnsiString MsgText;
}


на крайняк, можно и последнее поле запихнуть в какойнить char[256]... но не хотелось бы

Верна идея? 
PM MAIL   Вверх
leniviy
Дата 13.12.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(BasilL @ 13.12.2008,  10:00)
Код

struct Message
{
BYTE MsgType;    // или WORD MsgType
u_long MsgIP;    //u_long S_addr;
AnsiString MsgText;
}


Всё равно одновременное использование 
AnsiString как поля структуры + 
Код

send(clnt.socket, (const char*)&MsgSend, length, 0 )

не сработает.

можно так:
Код

struct Message
{
BYTE MsgType;    // или WORD MsgType
u_long MsgIP;    //u_long S_addr;
u_long MsgText_len;
char MsgText[];
}


но тогда надо и другие части проги менять: 

Код

Message *pMsgSend
Message *pMsgRecv;
...
AnsiString MsgText;
MsgText = ...
...
pMsgSend = (Message *)malloc(sizeof(Message)+length(MsgText));
pMsgSend->MsgIP = ...
pMsgSend->MsgType = ...
pMsgSend->MsgText_len = length(MsgText);
strncpy(pMsgSend->MsgText,PChar(MsgText),length(MsgText));
...
send(clnt.socket, (const char*)&pMsgSend, sizeof(Message)+pMsgSend->MsgText_len, 0 )



Сложно? Конечно. Потому лучше сделайте, как я посоветовал в пред. посте.
Оставьте структуру, как была, но напишите 2 функции для передачи/приёма такой структуры и 2 функции для передачи/приёма AnsiString

PM MAIL   Вверх
BasilL
Дата 13.12.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 26.5.2005
Где: Челябинск обл.

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



leniviy, спс за советы... у самого есть еще пара мыслей - на выходных поковыряю ))
PM MAIL   Вверх
J0ker
Дата 13.12.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(leniviy @  13.12.2008,  01:09 Найти цитируемый пост)
в C++ скорее всего смарт поинтер

скорее класс-оболочка над char массивом

Цитата(leniviy @  13.12.2008,  01:09 Найти цитируемый пост)
здесь явное нарушение безопасности типов

а как иначе вы предлагаете использовать recv?
другой вопрос в несоответствии кол-ва принимаемых данныы размерам структуры

Цитата(leniviy @  13.12.2008,  11:16 Найти цитируемый пост)
char MsgText[];

в C++ массивы нулевой длины не разрешены


--------------------
user posted image
PM MAIL   Вверх
leniviy
Дата 13.12.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(J0ker @  13.12.2008,  17:05 Найти цитируемый пост)
в C++ массивы нулевой длины не разрешены 

У меня нет с++ билдера, я не мог проверить.
В VS просто выскакивает 
Код

Warning    1    warning C4200: nonstandard extension used : zero-sized array in struct/union...


PM MAIL   Вверх
J0ker
Дата 13.12.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(leniviy @ 13.12.2008,  17:55)
Цитата(J0ker @  13.12.2008,  17:05 Найти цитируемый пост)
в C++ массивы нулевой длины не разрешены 

У меня нет с++ билдера, я не мог проверить.
В VS просто выскакивает 
Код

Warning    1    warning C4200: nonstandard extension used : zero-sized array in struct/union...

это не имеет отношения к конкретному компилятору
отступление от стандарта - потенциальный баг


--------------------
user posted image
PM MAIL   Вверх
Alca
Дата 19.12.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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





--------------------
PM WWW ICQ Skype Jabber   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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