Страница 1 из 2

Чат на С++. Помогите найти ошибку

Добавлено: 16 мар 2011, 16:36
Merzaffkia
Мне нужно написать чат, в Visual Studio 2008 на C++

В общем по порядку:
Пишу сервер

Создала проект MFC AppWizard(exe)
добавила несколько кнопок: Connect, Quit, Send и окно EditBoxa
создала переменную для окна EditBoxa - m_edit1

далее для класса каждой кнопки ввела код:

для кнопки Send:

Код: Выделить всё

void CServerokDlg::OnBnClickedButton3()
{
int BuffLenght = m_edit1.LineLength();
// Вычисляем длину сообщения
SendSocket.Send(&BuffLenght,4);
// Посылаем клиенту длинну сообщения.
char* Buffer = new char[BuffLenght];
// подготавливаем буффер для введенного текста
m_edit1.GetLine(0,LPTSTR(Buffer),BuffLenght);
//записываем введенную строку в буфер
SendSocket.Send(Buffer,BuffLenght);
delete Buffer;
}
для кнопки Connect:

Код: Выделить всё

void CServerokDlg::OnBnClickedButton1()
{
AfxSocketInit(); // Иннициализация системы сокетов
CSocket MySocket; //создаем класс сокета сервера
if(!MySocket.Create(22222))
{
MessageBox(LPCTSTR("Ne sozdan Cocket"),LPCTSTR(""),MB_OK);
printf ("Ne sozdan socket");
}
else
{
printf (" socket sozdan");
}
// вызываем функцию создания и иннициализации сокета
MySocket.Listen(); // слушаем запросы от клиентов
MySocket.Accept(SendSocket);
MessageBox(LPCTSTR("Gotov"),LPCTSTR(""),MB_OK);
printf("Gotov!");
}
Для кнопки Quit:

Код: Выделить всё

void CServerokDlg::OnBnClickedButton2()
{
SendSocket.Close(); // Закрываем сокет
CDialog::OnCancel();// Закрывем программу
}
компилирую - ошибок нет

далее тестирую через Telnet
и вот тут-то получаеться касяк((
он передаёт только лишь одно сообщение и ломается, пишет:
"This may be due to a corruption of the heap, which indicates a bug in Server.exe or any of DLL it has loaded."

Я новичок в этом деле и никак не могу понять что именно не правильно...
мб кто-нибудь подскажет как это исправить?

Re: Чат на С++. Помогите найти ошибку

Добавлено: 17 мар 2011, 09:36
BBB
Раз уж сообщение об ошибке что-то о хипе говорит...

Учитывая, что оператором new выделяетс массив:
char* Buffer = new char[BuffLenght];

то уж как минимум при освобождении следует писать
delete [ ] Buffer;

а не
delete Buffer;

Re: Чат на С++. Помогите найти ошибку

Добавлено: 17 мар 2011, 15:58
Merzaffkia
Попробовала... всё равно выдаёт ошибку:

Debuq Error!

program: ...\Serverok.exe
HEAP CORRUPTION DETECTED: after Nornal block(#307) at 0x0034B7F8.
CRT detected that the application wrote to memory after end neap buffer.
Memory allcated at C:\...\Serverokdlg.cpp(166).
(Press Retry to debug the application)

Re: Чат на С++. Помогите найти ошибку

Добавлено: 18 мар 2011, 12:48
BBB
Может быть, надо определять значение BuffLenght не как m_edit1.LineLength(), а как (m_edit1.LineLength() + 1), резервируя место под завершающий символ ASCII 0?
Я не знаю точно, как будет вести себя GetLine при подобном краевом эффекте.

Re: Чат на С++. Помогите найти ошибку

Добавлено: 18 мар 2011, 16:49
Merzaffkia
Делала...
всё равно тоже самое... :(

Re: Чат на С++. Помогите найти ошибку

Добавлено: 18 мар 2011, 23:35
Albor
LineLength() без параметра возвращает длину строки, в которой установлена каретка. Следующий вызов GetLine() получает нулевую строку в буфер, возможно, не своей длины. Если нужно получить длину всего текста, то можно так:

Код: Выделить всё

m_edit.SetSel(0,-1);
int nStartChar;
int nEndChar;
m_edit.GetSel(nStartChar,nEndChar);
int textLength=nEndChar+1;

Re: Чат на С++. Помогите найти ошибку

Добавлено: 18 мар 2011, 23:55
Albor
Да, весь текст из эдита можно получить вызовом GetWindowText().

Re: Чат на С++. Помогите найти ошибку

Добавлено: 22 мар 2011, 16:37
Merzaffkia
Спасибо за помощь!!! Попробую переписать...

Re: Чат на С++. Помогите найти ошибку

Добавлено: 22 мар 2011, 18:11
Albor
Ещё, можно буфер сделать статический, скажем размером 1024 байт, чтобы от души, для тех кто любит набирать длинные тексты. Функцией GetWindowText() читать туда данные, а возвращаемое значение использовать как размер передаваемых данных. Код значительно упростится.

Re: Чат на С++. Помогите найти ошибку

Добавлено: 23 мар 2011, 18:28
Merzaffkia
Я просто совсем-совсем новичок в программирование...

это вот так надо?)

Код: Выделить всё

 char* Buffer = new char[1024];
// подготавливаем буффер для введенного текста
 int GetWindowText(m_edit1, Buffer, 1024);
//записываем введенную строку в буфер
 SendSocket.Send(Buffer,1024);
//посылаем строку клиенту......ап...:-))
 delete Buffer;
//удаляем буфер