Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с CSocket

57K
12 июля 2010 года
rusek
16 / / 12.07.2010
Здравствуйте, уважаемые форумчане!
Сделал клиент серверное-приложение с использование сокета. При передаче обычной строки проблем не возникало, но с передачей структуры возникли проблемы.
typedef struct
{
CString datetime;
int id;
CString param;
CString value;
} Message;

Кусок кода клиента:
SYSTEMTIME st;
CString str;
char buf[10];
Message msg;
msg.id = ID_CLIENT;
msg.param = "parameter01";
msg.value = "Свойство1:true";
::GetLocalTime(&st);
COleDateTime dt(st);
msg.datetime = dt.Format(_T("%d/%m/%Y %H:%M:%S"));
m_cSocket->Send(msg,sizeof(msg));

Кусок кода сервера:
Message mes;
char buf[10];
int r = Receive(&mes,sizeof(mes));

m_Dlg->my_list.InsertItem(0,mes.datetime);
m_Dlg->my_list.SetItemText(0,1,_itoa(mes.id,buf,10));

При компиляции клиента выдается ошибка:
error C2664: 'CSocket::Send' : cannot convert parameter 1 from 'Message' to 'const void *'

Если передавать сообщение по сокету так:
m_cSocket->Send(&msg,sizeof(msg));
то сообщение по ошибке исчезает, но при этом сервер вылетает с ошибкой:
Unhandled exception at 0x7861d931 (mfc90d.dll) in Server.exe: 0xC0000005: Access violation reading location 0xfeeefeee.
14
13 июля 2010 года
Phodopus
3.3K / / 19.06.2008
Оформите код, это нечитаемо
57K
13 июля 2010 года
rusek
16 / / 12.07.2010
Обычную строку на приеме обрабатываю так:

 
Код:
int r = Receive(ff,40);
    ff[r] = '\0';
    AfxMessageBox(ff);


Структуру, содержащую только целочисленные поля

 
Код:
typedef struct
{
    int datetime;
    int id;
    int param;
} Message;


так:

 
Код:
int r = Receive(&mes,12);
    AfxMessageBox(_itoa(mes.datetime,buf,10));
    AfxMessageBox(_itoa(mes.id,buf,10));
    AfxMessageBox(_itoa(mes.param,buf,10));

и они дают ожидаемый результат.

Проблема конкретно с отправкой-приемом структуры, содержащей типы с непостоянной длиной (напр. строки):

 
Код:
typedef struct
{
    CString datetime;
    int id;
    CString param;
    CString value;
} Message;


Такой прием:

 
Код:
int r = Receive(&mes,100);
    AfxMessageBox(mes.datetime);
    AfxMessageBox(_itoa(mes.id,buf,10));
    AfxMessageBox(mes.param);
    AfxMessageBox(mes.value);


приводит к вылету с ошибкой:
 
Код:
Unhandled exception at 0x77d5e176 in Server.exe: 0xC0000005: Access violation reading location 0x0033a000
57K
14 июля 2010 года
rusek
16 / / 12.07.2010
Неужели никто не отправлял подобные структуры?
14
14 июля 2010 года
Phodopus
3.3K / / 19.06.2008
CString это не "строка", это объект. Объекты так по сети передавать нельзя, их надо сериализовать.
57K
14 июля 2010 года
rusek
16 / / 12.07.2010
Phodopus, почему же тогда
 
Код:
CString ff = "проба!";
    m_cSocket->Send(ff,ff.GetLength());

спокойно передается и на приеме без проблем обрабатывается как обычная строка?
14
14 июля 2010 года
Phodopus
3.3K / / 19.06.2008
Вы все же почитайте про сериализацию и про неявные преобразования..
57K
15 июля 2010 года
rusek
16 / / 12.07.2010
Решил проблему тем, что структуру сделал такой:
 
Код:
typedef struct
{
    char datetime[20];
    int id;
    char param[20];
    char value[100];
} Message;

ее размер вполне адекватно возвращает sizeof().
Сначала была проблема с присвоением значения такой строке, но вспомнил про strcpy() и проблема решилась.

Всем спасибо за внимание!:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог