int r = Receive(ff,40);
ff[r] = '\0';
AfxMessageBox(ff);
Проблема с CSocket
Сделал клиент серверное-приложение с использование сокета. При передаче обычной строки проблем не возникало, но с передачей структуры возникли проблемы.
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.
Оформите код, это нечитаемо
Код:
Структуру, содержащую только целочисленные поля
Код:
typedef struct
{
int datetime;
int id;
int param;
} Message;
{
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));
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;
{
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);
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
Неужели никто не отправлял подобные структуры?
CString это не "строка", это объект. Объекты так по сети передавать нельзя, их надо сериализовать.
Код:
CString ff = "проба!";
m_cSocket->Send(ff,ff.GetLength());
m_cSocket->Send(ff,ff.GetLength());
спокойно передается и на приеме без проблем обрабатывается как обычная строка?
Вы все же почитайте про сериализацию и про неявные преобразования..
Код:
typedef struct
{
char datetime[20];
int id;
char param[20];
char value[100];
} Message;
{
char datetime[20];
int id;
char param[20];
char value[100];
} Message;
ее размер вполне адекватно возвращает sizeof().
Сначала была проблема с присвоением значения такой строке, но вспомнил про strcpy() и проблема решилась.
Всем спасибо за внимание!:)