в debug режиме когда я подключаюсь к серверу он мне выкидывает ошибку:
Debug Assertion Failed!
и там три кнопочки: Стоп,Повтор,Пропустить.
Нажимаю Пропустить.. все прекрасно работает.
Но! когда комилишь релиз, то на этом месте программа просто вылетает! и все.
пробывал нажимать на повтор, он мне тыкает вот в такие строчки
файл sockcore.cpp
BOOL CAsyncSocket::Accept(CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr, int* lpSockAddrLen)
{
ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET);
ASSERT(CAsyncSocket::FromHandle(INVALID_SOCKET) == NULL);
CAsyncSocket::AttachHandle(INVALID_SOCKET, &rConnectedSocket);
SOCKET hTemp = accept(m_hSocket, lpSockAddr, lpSockAddrLen);
if (hTemp == INVALID_SOCKET)
{.........
...
потом
BOOL CAsyncSocket::Socket(int nSocketType, long lEvent,
int nProtocolType, int nAddressFormat)
{
ASSERT(m_hSocket == INVALID_SOCKET);
m_hSocket = socket(nAddressFormat,nSocketType,nProtocolType);
if (m_hSocket != INVALID_SOCKET)
{
CAsyncSocket::AttachHandle(m_hSocket, this, FALSE);
return AsyncSelect(lEvent);
}
return FALSE;
}
вот сам код:
#include <afxwin.h>
#include <afxsock.h>
#define CLIENTCONNECT 11111
#define RECEIVE 22222
#define EDIT1 311
#define EDIT3 313
#define LBOX1 411
#define EDIT2 312
#define EDIT4 314
//CMySocket
class CMySocket : public CSocket
{
public:
CMySocket(){};
virtual void OnAccept(int nErrorCode);
virtual void OnReceive(int nErrorCode);
};
void CMySocket::OnReceive(int nErrorCode)
{
AfxGetApp()->m_pMainWnd->SendMessage(RECEIVE);
CSocket::OnReceive(nErrorCode);
}
void CMySocket::OnAccept(int nErrorCode)
{
AfxGetApp()->m_pMainWnd->SendMessage(CLIENTCONNECT);
CSocket::OnAccept(nErrorCode);
}
//CMainWnd
class CMainWnd : public CDialog
{
public:
CMainWnd(CWnd *pParent=NULL);
~CMainWnd();
virtual BOOL OnInitDialog();
CMySocket m_pListenSocket;
CMySocket m_pClientSocket;
CMySocket m_pServerSocket;
afx_msg void ClientAccept();
afx_msg void Receive();
SendMsg();
Update();
UpdateServ();
private:
CString IP;
CString name;
int ServOK;
CString buffer;
CString temp;
CString TextIn;
CButton Btn1;
CButton Btn2;
CButton Btn3;
CStatic stc1;
CStatic stc2;
CEdit Edt1;
CEdit Edt3;
CEdit Edt2;
CEdit Edt4;
BtnConnect();
BtnServer();
CString Text;
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMainWnd,CDialog)
ON_COMMAND(211,BtnConnect)
ON_COMMAND(212,BtnServer)
ON_COMMAND(213,SendMsg)
ON_MESSAGE(CLIENTCONNECT,ClientAccept)
ON_MESSAGE(RECEIVE,Receive)
END_MESSAGE_MAP()
CMainWnd::Update()
{
GetDlgItem(EDIT2);
Edt2.GetWindowText(Text);
TextIn="";
Edt1.GetWindowText(TextIn);
Text.Insert(555,name);
Text.Insert(555,TextIn);
Text.Insert(555,"\r\n");
Edt2.SetWindowText(Text);
Edt2.SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);
}
CMainWnd::UpdateServ()
{
GetDlgItem(EDIT2);
Edt2.GetWindowText(Text);
TextIn=buffer;
Text.Insert(555,TextIn);
Text.Insert(555,"\r\n");
Edt2.SetWindowText(Text);
Edt2.SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);
}
CMainWnd::SendMsg()
{
if (ServOK==1)
{
GetDlgItem(EDIT1);
temp=name;
Edt1.GetWindowText(TextIn);
temp.Insert(555,TextIn);
TextIn=temp;
m_pServerSocket.Send(TextIn,TextIn.GetLength());
Update();
};
if (ServOK==0)
{
GetDlgItem(EDIT1);
Edt1.GetWindowText(TextIn);
temp=name;
temp.Insert(555,TextIn);
TextIn=temp;
m_pClientSocket.Send(TextIn,TextIn.GetLength());
Update();
};
}
void CMainWnd::Receive()
{
int nRead;
char buff[4096];
if (ServOK==1) nRead=m_pServerSocket.Receive(buff,4096);
if (ServOK==0) nRead=m_pClientSocket.Receive(buff,4096);
buff[nRead]=NULL;
buffer=buff;
UpdateServ();
}
void CMainWnd::ClientAccept()
{
m_pListenSocket.Accept(m_pServerSocket);
}
CMainWnd::BtnConnect() //Кнопка коннент
{
ServOK=0;
Edt4.GetWindowText(name);
name.Insert(555," said ");
Edt3.GetWindowText(IP);
m_pClientSocket.Connect(IP,9999);
Edt4.SetReadOnly();
Edt3.SetReadOnly();
SetWindowText("Client");
}
CMainWnd::BtnServer() //Кнопка сервер
{
ServOK=1;
Edt4.GetWindowText(name);
name.Insert(555," said ");
Edt4.SetReadOnly();
Edt3.SetReadOnly();
m_pListenSocket.Listen();
SetWindowText("Server");
}
CMainWnd::CMainWnd(CWnd* pParent) //конструткор главного диалогова окна
:CDialog(111,pParent)
{
}
CMainWnd::OnInitDialog()
{
m_pListenSocket.Create(9999);
m_pServerSocket.Create();
m_pClientSocket.Create();
SetWindowText("Main");
//-------------------------- кнопки -----------------------------------------
Btn1.Create("Connect...",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(383,125,463,150),this,211);
Btn2.Create("Server",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(383,155,463,180),this,212);
Btn3.Create("Send",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(370,310,470,330),this,213);
//-------------------------- CEdit ------------------------------------------
Edt1.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_MULTILINE|ES_LEFT ,CRect(15,310,360,330),this,EDIT1);
Edt2.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_MULTILINE|ES_LEFT,CRect(15,10,360,290),this,EDIT2);
Edt2.SetReadOnly();
Edt3.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_CENTER,CRect(365,40,480,60),this,EDIT3);
Edt3.SetWindowText("127.0.0.1");
Edt4.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_CENTER,CRect(365,95,480,115),this,EDIT4);
Edt4.SetWindowText("User");
//-------------------------- CStatic ----------------------------------------
stc1.Create("Server's IP",WS_VISIBLE|WS_CHILD|SS_CENTER,CRect(385,15,465,40),this);
stc2.Create("Nik Name",WS_VISIBLE|WS_CHILD|SS_CENTER,CRect(385,70,465,95),this);
return TRUE;
}
CMainWnd::~CMainWnd()
{
}
//CApp
class CApp : public CWinApp
{
public:
CApp(){};
virtual BOOL InitInstance();
};
CApp::InitInstance()
{
AfxSocketInit();
CMainWnd dlg;
m_pMainWnd= &dlg;
dlg.DoModal();
return FALSE;
};
CApp theApp;
и что это за ASSERT?
как найти и исправить ошибку?
ASSERT — специальный макрос, который в релиз-версии ничего не делает, а в дебаг — выводит отладочное сообщение. В твоем случае rConnectedSocket.m_hSocket = INVALID_SOCKET, а значит его использовать нельзя. Считается, что на этапе тестирования все ошибки подобного рода будут выявлены, поэтому в релиз-версии ASSERT не нужен. Разбирайся в коде и смотри, что у тебя не так с сокетами. В частности, проверяй результат всех функций, создающих сокеты.
Да, вы правы. Я не слишком внимательно посмотрел. Но сути макроса ASSERT это не меняет.
B>Прошу прощения, но по-моему, в данном случае сокет должен быть равен INVALID_SOCKET, любые другие значения приведут к ошибке, это делается для того, чтобы в функцию случайно не попал хэндлер уже используемого сокета. В rConnectedSocket.m_hSocket вернется значение после выполнения функции accept, отправку и получение информации потом следует производить через rConnectedSocket. Нужно просто проинициализировать rConnectedSocket. Посмотри внимательно код и все поймешь.
спасибо за ответы.. ошибку я нашел, в debug версии все работате хорошо, а вот в релизе просто вылетает =)
не знаю что делать
Visual C пишет: Unhandled exception in server.exe: 0xC0000005: Access Violation.
нажимаешь OK он тебе Assembler показывает.
Здравствуйте, arki, Вы писали:
A>спасибо за ответы.. ошибку я нашел, в debug версии все работате хорошо, а вот в релизе просто вылетает =)
A>не знаю что делать
A>Visual C пишет: Unhandled exception in server.exe: 0xC0000005: Access Violation.
A>нажимаешь OK он тебе Assembler показывает.
Посмотри внимательно, все ли объекты в твоей программе проинициализированы правильно. В дебаг-версии в непроиниченные локальные объекты попадает всякий мусор, а в релизе объект может заполниться нулями, сам по молодсти налетал на это кучу раз

Так что в дебаге, например, указатель может быть != 0, а в релизе — наоборот, отсюда и access violation.
о

.. спасибо, статья как раз кстати.... помогла...