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

Поиск:

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


Шустрый
*


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

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



Помогите передать и принять структуру по сети. Что надо передавать в полях данные и размер?

struct Contr {short mouse_x;            
    short mouse_y;            
    BYTE action;};         
Contr con;
send(s,(char*)&con,sizeof(Contr),0);
PM MAIL   Вверх
ptr
Дата 11.12.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Agentx86 @  10.12.2006,  23:39 Найти цитируемый пост)
Что надо передавать в полях данные и размер?

Все зависит от того как устроена программа.

Цитата(Agentx86 @  10.12.2006,  23:39 Найти цитируемый пост)
Помогите передать и принять структуру по сети.

В чём проблема то?


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Agentx86
Дата 11.12.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все решил сам. Всем спасибо.
PM MAIL   Вверх
ptr
Дата 11.12.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну тогда пометь тему как решённую.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
witex
Дата 11.12.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А ещё лудше покажи, как решил? мне тож интересно!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
drZmeu
Дата 4.1.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да показывай. Всем интересно ;)    smile 
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
ptr
Дата 6.1.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Господа вы меня пугаете smile .


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
drZmeu
Дата 6.1.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile
Да ладно тебе ptr просто никогда не сталкивались =)))
Мне чёт кажется вот так :
struct Contr {short mouse_x;            
    short mouse_y;            
    BYTE action;};         
Contr con;
send(s,con,sizeof(con),0);
или так:
send(s,con,strlen(con),0);
 smile 
 Ну незнаю я =))) Хотя скоро пригодится =)
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
witex
Дата 6.1.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



send(s,(constr char*)&con,sizeof(Contr),0); банально! я посмотрел ещё тогда в мсдн и в купил! там же чётко написанно какой тип данных передаётся! тема старая, решённая! если автор забыл поставить галочку о том что тема решена! ненадо её поднимать! 
drZmeu , не трогой темы тарые!

Это сообщение отредактировал(а) witex - 6.1.2007, 23:30
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Sergio
Дата 29.1.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Народ помогите и мне передать структуру. Вот что я написал:

Код

struct _paket {
      char msg[50] = {"Hello world!"};
      int user = 10;
  };

_paket paket;

Потом:
Код

 send(mySocket,(char*)&paket,sizeof(paket),0); 

Какая-то ошибка smile 
И еще вопрос: как принимать структуру? Что чему присваивать?

PM MAIL ICQ   Вверх
drZmeu
  Дата 26.3.2007, 23:20 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я очень извеняюсь что поднимаю старую тему!
С отправкой структуры всё понятно!
А вот с приёмом вобшем у мну такойже вопрос как и у Serqio !
И еще вопрос: как принимать структуру? Что чему присваивать?
Код

struct Contr{
char szSendSt[1024];
BYTE szByteSt;
};

К примеру я отправил такую структуру на сервер! Как сервер должен разбирать принятые данные???

Тоесть у сервера есть похожая структура:
Код

struct Bound{
    char szRecvSt[1024];
    BYTE szByteSt;
};


Как мне присвоить текст в szRecvSt и байт в szByteSt ,,,???,,, smile 
Ещё раз извеняюсь за поднятие старой темы. написал тут чтоб не создавать новую !
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
Dray
Дата 26.3.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Не надо её отправлять целеком! Если в структуре есть сложные элементы, такие как строки, то отправлять её надо по частям, и принимать так же. А если у вас там указатели, сами ведь понимаете такое:
Код
send(s,con,sizeof(con),0);

НЕ ПРОКАТИТ!


--------------------
忍者

user posted image
PM MAIL   Вверх
drZmeu
  Дата 27.3.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



>Не надо её отправлять целеком! Если в структуре есть сложные элементы, такие как строки, то >отправлять её надо по частям, и принимать так же. А если у вас там указатели, сами ведь >понимаете такое:код C++
>1:
>        send(s,con,sizeof(con),0);
>
>
>
>
>НЕ ПРОКАТИТ!

Ну я почемуто так и думал! Неудобно =\
Вопрост тогда зачем передавать структуру полностью
аля:
Код

send(s,(constr char*)&con,sizeof(Contr),0);

Если её незя принять и разсортировать??? smile 
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
Greeen
Дата 27.3.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(drZmeu @  27.3.2007,  09:35 Найти цитируемый пост)
Если её незя принять и разсортировать???

Почему незя, можно. У тебя 1 Кб + 1 байт передаются. Вполне нормальный размер чтобы передавать его целиком. Потом получаешь (recv) и приводишь буфер к твоему типу.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
ptr
Дата 28.3.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Прежде чем что-либо (структуру, класс ...) передавать по сети, нужно вначале это что-то сериализовать.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
drZmeu
Дата 28.3.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А можно примерчик  smile 
А то у меня уже мозги закипают  smile 
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
leniviy
Дата 5.6.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня вопрос. Может ли команда recv разбить принимаемую структуру на несколько частей. Например, я точно знаю, что сервер мне послал 10 байт. Может ли первый вызов recv вернуть меньше 10? Я пока от неуверенности , пользую эту функцию
Код

    int recvExactly(SOCKET s, char* buf, int len, int flags)
    {
        int result;
        char* buf1 = buf;
        while(buf1-buf < len)
        {
            result = ::recv(s, buf1, len, flags);
            if ((result==SOCKET_ERROR)||(result==0)) return result;
            buf1 += result;
            len -= result;
        }
        return (int)(buf1-buf);
    }

PM MAIL   Вверх
ptr
Дата 6.6.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, recv возвращает только то, что пришло на данный момент. Поэтому количество байт может быть не больше того, что было затребовано.

P.S. если хочешь задать какой-нибудь вопрос, то лучше для этого создавать новую тему. Тем более что вопрос никак не связан с текущей темой.

Это сообщение отредактировал(а) ptr - 6.6.2007, 15:11


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
intel
Дата 13.9.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



После тово как получил структуру по сокету и запихал её в буфер, хочу привести тот самый буфер к типу структуры, 
но компилятор кричит "так не пойдёт". Не пойму где я там касяк спорол

Вот кусок кода:
Код

char buf[256];

int rc = recv(s,buf,sizeof(buf),0);

if( rc <= 0 )
    cout<<"recv error"<<endl;

else
    cout<<((Data)buf).x;

А вот мой тип (подключаю в голове):
Код

class Data {
    public:
        int x;
        int y;
};

Спасибо
PM MAIL   Вверх
leniviy
Дата 14.9.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



((Data*)&buf)->x
PM MAIL   Вверх
intel
Дата 14.9.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо leniviy, всё получилось
PM MAIL   Вверх
intel
Дата 17.9.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот ещё небольшая проблемка.

по сокету отправляю структуру в сторону клиента, но тот ничего не получает, хотя блок else  выполняется. 
В структуре int и указатель на char. 

Вообщем вот кусок от server'а:
Код

Message myMessage;
myMessage.messageType   = REGISTER;
myMessage._message      = "hallo\0";

int rs = send(client[i],(const char*)&myMessage,sizeof(myMessage),0);


А вот от клиента:
Код

char buf[256];

if( rr <= 0 )
    cout<<"recv error"<<endl;

else {
    cout<<"recv OK"<<endl;
    buf[rr] = '\0';
    cout<<((Message*)&buf)->_message;
}

Ну и моя структура до кучи:
Код

struct Message {
    char *_message;
    int messageType;
};

Вот что выходит на консоль (у клента):
Код

Connect OK
Recv OK


Сдаётся мне там чтото с char'ом не то...
PM MAIL   Вверх
dumb
Дата 17.9.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(intel @  17.9.2007,  21:25 Найти цитируемый пост)
Сдаётся мне там чтото с char'ом не то...
правильно сдается - ты пересылаешь указатель на строку, а не саму строку.

структура должна быть примерно такого вида:
Код

#pragma pack(push,1)
struct Message {
    int messageType;
    int messageLen;
    char _message[0];
};
#pragma pack(pop)
...
// пример подготовки и отсылки
char s[] = "hallo";
int len=strlen(s);
Message *msg = (Message*)new char[sizeof(Message)+len+1];
msg->messageType = 0;
msg->messageLen = len;
strcpy(msg->_message, s)
send(client[i],(const char*)msg, sizeof(Message)+len+1,0);
delete[] (char*)msg;
...


и при получении надо учитывать тот момент, что данные, отосланные одним вызовом send, вовсе не обязательно придут одним куском - вполне возможно их нужно будет читать несколькими вызовами recv.
PM MAIL   Вверх
intel
Дата 18.9.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо dumb, скопировал твой предложенный вариант, заработало как по маслу, 
вот тока не въеду што значят #pragma pack(push,1) и #pragma pack(pop)? 
В гугле ничево не нарыл, поясни если не затруднит
PM MAIL   Вверх
Artemon
Дата 19.9.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Все так весело передают структуры по сокетам, даже не задумываясь о выравнивании струкуры в памяти.

Только лишь dumb не стал этим принебрегать (на то он и эксперт).

#pragma pack(push,1) - отменяет выравнивание.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
mrbrooks
Дата 20.9.2007, 15:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Комрады если уж сыр - бор про передачу инфы через сокеты - то как насчет юзанья структуры WSANETWORKEVENTS. А именно что бы сохранить инфу от сервера на клиенте скажим хотя бы в файл. Кто нибудь посоветует что нибудь? Пжаста!

Это сообщение отредактировал(а) mrbrooks - 20.9.2007, 15:15
PM MAIL   Вверх
dumb
Дата 20.9.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(mrbrooks @  20.9.2007,  16:14 Найти цитируемый пост)
как насчет юзанья структуры WSANETWORKEVENTS. А именно что бы сохранить инфу от сервера на клиенте скажим хотя бы в файл.
какая связь между словами в этих предложениях?
PM MAIL   Вверх
mrbrooks
Дата 21.9.2007, 08:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(dumb @ 20.9.2007,  23:13)
какая связь между словами в этих предложениях?

TCP/IP
PM MAIL   Вверх
Skladnoy
Дата 21.9.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Artemon @  19.9.2007,  13:01 Найти цитируемый пост)
Все так весело передают структуры по сокетам, даже не задумываясь о выравнивании струкуры в памяти.

А еще int может иметь разный размер, разную endianness... Вообще говоря.
PM MAIL   Вверх
BasilL
Дата 12.12.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Приветствую!
Не стал создавать новую тему - спрошу здесь

имеем структуру
Код

struct Message
    {
            AnsiString MsgType;
            AnsiString MsgIP;
            AnsiString MsgText;
    };
Message MsgRecv;
Message MsgSend;


передаем
Код

MsgSend.MsgType = "0004";
MsgSend.MsgIP = inet_ntoa(new_sa.sin_addr);
MsgSend.MsgText = MsgText_;
int length = MsgSend.MsgType.Length() + MsgSend.MsgIP.Length() + MsgSend.MsgText.Length() + 1;
if (SOCKET_ERROR == (send(clnt.socket, (const char*)&MsgSend, length, 0 ) ) )
{
// Error...
int error = WSAGetLastError();
ErrorMessage(error);      // ...
// ...
}


принимаем
Код

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


все передается и принимаеться нормально. Но далее происходит вот что
Код

if (MsgRecv.MsgType == "0100")
{
// обработка
}

Как только выполнение программы приходит на строку с if ((MsgRecv.MsgType) == "0100") условие срабатывает... Хотя в принятом MsgRecv.MsgType = "0004"... Смотрю в отладчике - да, все принимается ок, MsgType = "0004". Программа переходит на строку с проверкой условия - и MsgType становится равно "0100".... Пробовал менять значения в условии - что бы ни поставил, всегда MsgType становится равным ему... Как будто в if-е не "==" стоит, а "="....
В чем может быть дело?

Это сообщение отредактировал(а) BasilL - 12.12.2008, 23:11
PM MAIL   Вверх
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 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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